0

例如,在dgo 文档中有这个片段

// If omitempty is not set, then edges with empty values (0 for int/float, "" for string, false
// for bool) would be created for values not specified explicitly.

type Person struct {
    Uid      string     `json:"uid,omitempty"`
    Name     string     `json:"name,omitempty"`
    Age      int        `json:"age,omitempty"`
    Dob      *time.Time `json:"dob,omitempty"`
    Married  bool       `json:"married,omitempty"`
    Raw      []byte     `json:"raw_bytes,omitempty"`
    Friends  []Person   `json:"friend,omitempty"`
    Location loc        `json:"loc,omitempty"`
    School   []School   `json:"school,omitempty"`
    DType    []string   `json:"dgraph.type,omitempty"`
}

该评论被表述为好像省略omitempty是一件坏事。

4

1 回答 1

0

与往常一样,这取决于...取决于您的特定用例和数据模型。

如果字段的值是类型默认的零值,则对字段进行 omitempty 会导致 json.Marshal 结果中缺少该字段。如果没有 omitempty,json 将始终包含该字段,如果未设置为其他值,它将是类型默认的零值。例如,年龄字段缺少以下结构:

type Person struct {
   Uid      string     `json:"uid,omitempty"`
   Name     string     `json:"name,omitempty"`
   Age      int        `json:"age"
}

p := Person{
  Uid: "0x1",
}

js, _ := json.Marshal(&p)

生成的 json 将没有 name 字段,但年龄为 int 的默认零值,即 0:

{"uid": "0x1", "age": 0}

如果将此 json 发送到 Dgraph 突变,则该节点的年龄将设置为 0 并覆盖节点的当前年龄值,而名称将保持不变。所以在这种情况下,省略年龄字段是有意义的,否则在使用 json 调用突变之前,您必须始终将年龄字段设置为正确的值,即使您只想更改节点的名称字段。

如果您希望某个字段始终设置为其默认零值(如果未在结构中另行设置),则不要对该字段使用 omitempty。

于 2020-02-16T22:20:13.863 回答