Go Google Datastore nulls

问题描述 投票:0回答:1

我有如下所示的数据存储对象:

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

我的问题是:

  • 我是 Go 的新手。我在这里做错了什么吗? (任何拼写错误都是 Stackoverflow 特有的。因为我在这里更改了一些东西)
  • 在将数据存储放入结构之前,有没有办法查看发送回的数据存储?
  • 有些值有时会是
    null
    。比如
    start
    end
    details
    。这对结构中的
    string
    有效吗?

谢谢。

google-app-engine go struct null google-cloud-datastore
1个回答
1
投票

立即突出的两个问题:

  1. 结构体字段必须导出,所以他们的名字以大写字母开头。
  2. 您的标签值“无效”(它们不遵循约定)。你不能在键
    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 获取空对象

为什么结构字段显示为空?

如果 Datastore 中的属性是

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

© www.soinside.com 2019 - 2024. All rights reserved.