Dgraph:始终在Golang结构字段中使用无礼是一种最佳实践吗?

时间:2019-12-14 08:35:08

标签: dgraph

例如,dgo doc

中有此代码段
// 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是一件坏事。

1 个答案:

答案 0 :(得分:0)

一如既往,这取决于您的特定用例和数据模型。

如果字段不适当,则该字段将在json.Marshal结果中丢失,如果其值是默认的零值类型。如果没有遗弃性,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的默认零值age,即0:

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

如果将此json发送到Dgraph突变,则该节点的age设置为0并覆盖节点当前的age值,而name则保持不变。因此,在这种情况下,可以对age字段进行适当的修改,否则,即使您只想更改节点的name字段,也必须在使用json调用突变之前始终将age字段设置为正确的值。

如果希望在结构中未另外设置字段时始终将其设置为默认的零值,则不要对该字段使用temptempty。