Go结构字段的第三个参数是什么?

时间:2014-08-26 03:05:33

标签: go

type Config struct {
    CommitIndex uint64 `json:"commitIndex"`
    // TODO decide what we need to store in peer struct
    Peers []*Peer `json:"peers"`
}

我理解前两列是什么,但是json:"commitIndex"是什么?

2 个答案:

答案 0 :(得分:28)

它被称为struct标记,可以在运行时使用reflect包解析它们。

来自https://golang.org/ref/spec#Struct_types

  

字段声明后面可以跟一个可选的字符串文字标记,该标记成为相应字段声明中所有字段的属性。

     

通过反射界面使标签可见,并参与结构的类型标识,否则将被忽略。

一些使用jsonxml等反射的软件包使用标记来更好地处理特殊情况。

答案 1 :(得分:13)

您所指的是标记 Go specification 表示:

  

字段声明后面可以跟一个可选的字符串文字标记,   它成为相应的所有字段的属性   现场申报。标签通过反射可见   接口并参与结构的类型标识,但不是   忽略。

// A struct corresponding to the TimeStamp protocol buffer.
// The tag strings define the protocol buffer field numbers.
struct {
    microsec  uint64 "field 1"
    serverIP6 uint64 "field 2"
    process   string "field 3"
}

这在编译时没有任何作用,但在对结构进行运行时反射时由不同的包使用。正如Amit已经指出的那样,encoding/json包正在使用它来指定编组/解组行为。 encoding/xmlgopkg.in/mgo.v2/bson等也是如此。

标签字符串按惯例是空格分隔的字符串。如 reflect package

中所述
  

按照惯例,标记字符串是可选的串联   以空格分隔的键:"值"对。每个键都是非空字符串   由空间以外的非控制字符组成(U + 0020''),   引用(U + 0022'"')和冒号(U + 003A':')。每个值都使用引用   U + 0022'"'字符和Go字符串文字语法。