我有看起来像的数据存储对象:
created (timestamp)
guid (string)
details (string)
start (string)
end (string
通常,
details
,start
或end
是NULL
。在Go中,我正在尝试执行以下操作:
type Edge struct {
created time.Time
details string `datastore: "details,omitempty"`
guid string `datastore: "guid,omitempty"`
start string `datastore: "start,omitempty"`
end string `datastore: "end,omitempty"`
}
for t := client.Run(ctx, q); ; {
var x Edge
key, err := t.Next(&x)
if err == iterator.Done {
break
}
if err != nil {
fmt.Printf("error caught: %v\n\n", err)
}
fmt.Printf("Key=%v\nEdge=%#v\n\n", key, x)
}
输出错误始终类似于:
error caught: datastore: cannot load field "guid" into a "main.Edge": no such struct field
Key=/edges,4503602429165568
Edge=main.Edge{created:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}, details:"", guid:"", start:"", end:""}
当我在数据存储区控制台中搜索该键时,我看到
guid
是有效的string
。GetAll
给了我几乎相同的问题。我的问题是:
null
。像start
,end
和details
一样。这对结构中的string
有效吗? 谢谢你。
最佳答案
立即出现的两个问题:
datastore:
和值"details,omitempty"
之间留空格。 因此,使用以下结构定义:
type Edge struct {
Created time.Time `datastore:"created"`
Details string `datastore:"details,omitempty"`
Guid string `datastore:"guid,omitempty"`
Start string `datastore:"start,omitempty"`
End string `datastore:"end,omitempty"`
}
对于上述两个问题,请参阅类似的问题:
golang mgo getting empty objects
Why struct fields are showing empty?
如果数据存储区中的属性为
null
,则对于Go结构而言这不是问题。在这种情况下,对应的struct字段将是其类型的zero-value,如果是""
类型,则为空字符串string
。如果要区分数据存储区null
,数据存储区“缺少属性”和实际的空字符串""
,则可以将字段类型更改为指针(例如*string
),在这种情况下,缺少属性和null
值将与nil
指针值相对应,而现有但为空的字符串值将为指向空字符串值的非nil
指针。