我有看起来像的数据存储对象:

created (timestamp)
guid (string)
details (string)
start (string)
end (string

通常,detailsstartendNULL

在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给了我几乎相同的问题。

我的问题是:
  • 我是新手。我在这里做错什么吗? (任何拼写错误都是特定于Stackoverflow的。因为我在这里做了一些更改)
  • 在将数据存储到结构中之前,是否仍要查看它返回的数据存储是什么?
  • 有些值有时是null。像startenddetails一样。这对结构中的string有效吗?

  • 谢谢你。

    最佳答案

    立即出现的两个问题:

  • 必须导出结构字段,因此其名称以大写字母开头。
  • 您的tag values是“无效的”(它们不遵循约定)。您不得在键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指针。

    10-02 10:21
    查看更多