【发布时间】:2017-11-21 16:50:23
【问题描述】:
我有两个相似的结构,我想将一个分配给另一个。 第一个“设备”是用来匹配数据库的结构。第二个“JsonEquipment”是解析JSON数据的辅助结构。
这是一个例子:
type Equipment struct {
ID uint
CategoryID uint
Ip string
Login string
Password string
}
type JsonEquipment struct {
ID *uint
Category *string
Ip *string
Login *string
Password *string
}
指针用于检查 JSON 中是否存在该字段。更多信息:How to recognize void value and unspecified field when unmarshaling in Go?
所以目前我创建了一个带有许多“if”的函数来检查并分配给设备,但我想知道是否有更好、更清洁的解决方案。
func CreateEquipment(item JsonEquipment) (Equipment) {
e := Equipment{}
if item.ID != nil && !previousEquipment.Auto { // Is the field present & not automatic equipment
e.ID = *item.ID
}
if item.Ip != nil { // Is the field present ?
e.Ip = *item.Ip
}
if item.Login != nil { // Is the field present ?
e.Login = *item.Login
}
[...]
return e
}
我希望你能理解这个想法。
这个问题类似于 Assign struct with another struct 但由于指针不同而不同 => 非指针结构
【问题讨论】:
-
为什么不直接使用接口?你为什么还要检查这些值是否不为零?
-
所以让我把流程弄清楚。 1)你得到一个json格式的设备; 2)您要检查设备的json是否具有您需要的所有值; 3) 使用
Equipment结构将其写入数据库。 -
为了避免大量
ifs,您可以为每种可能的类型组合创建简单的辅助函数,例如string/*string、int/*int、int64/*int64等play.golang.org/p/i1c4D6lwY2 -
@DenysSéguret 如果我不检查,我会得到一个指针错误;为什么我需要?因为当我更新设备时,我需要区分我想设置空值(例如 IP)的情况,我只想保留以前的值(未分配)
-
@Mihailo 是的,你明白了!
标签: pointers go struct go-gorm