【问题标题】:Go Google Datastore nullsGo Google 数据存储区空值
【发布时间】:2017-11-20 17:57:29
【问题描述】:

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

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

detailsstartend 通常是 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 给了我几乎同样的问题。

我的问题是:

  • 我是 Go 新手。我在这里做错了什么吗? (任何拼写错误都是 Stackoverflow 特有的。因为我在这里更改了一些内容)
  • 在将数据存储区放入结构之前,是否有办法查看它发回的状态?
  • 某些值有时为null。比如startenddetails。这对结构中的 string 有效吗?

谢谢。

【问题讨论】:

    标签: google-app-engine go struct null google-cloud-datastore


    【解决方案1】:

    立即突出的两个问题:

    1. 必须导出结构字段,因此它们的名称以大写字母开头。
    2. 您的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"`
    }
    

    请参阅上述 2 个问题的类似问题:

    golang mgo getting empty objects

    Why struct fields are showing empty?

    如果 Datastore 中的属性是 null,那么对于 Go 结构体来说这不是问题。在这种情况下,相应的结构字段将是其类型的zero-value,在string 类型的情况下为空字符串""。如果您希望能够区分数据存储区null、数据存储区“缺失属性”和实际的空字符串"",您可以将字段类型更改为指针(如*string),在这种情况下缺少属性和null 值将对应于nil 指针值,并且现有但为空的字符串值将是指向空字符串值的非nil 指针。

    【讨论】:

    • 就是这样!后续问题:有没有办法在同一个标​​签中设置 noindex 和 omitempty?
    • @Chemdream 用逗号分隔它们,例如datastore:"end,omitempty,noindex",但如果支持,请查阅文档。
    • 与这个问题无关,但我想你可能想分享iterator.Done 的来源。我浏览了 google cloud go 客户端库,我看到它是从 "google.golang.org/api/iterator" 导入的。您是否只是将其导入到与查询函数相同的文件中?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    • 2013-06-14
    • 2011-02-16
    • 2013-12-03
    • 1970-01-01
    相关资源
    最近更新 更多