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

Buf*_*lls 34 go

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

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

One*_*One 35

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

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

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

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

一些使用反射的包jsonxml使用标签来更好地处理特殊情况.


ANi*_*sus 15

你所指的是一个标签,Go规范说明:

字段声明后面可以跟一个可选的字符串文字标记,该标记成为相应字段声明中所有字段的属性.标签通过反射界面可见,并参与结构的类型标识,否则将被忽略.

// 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"
}
Run Code Online (Sandbox Code Playgroud)

这在编译时不起作用,但在对结构进行运行时反射时由不同的包使用.正如Amit已经指出的那样,encoding/json软件包正在使用它来指定编组/解组行为.这同样有encoding/xml,gopkg.in/mgo.v2/bson等等.

按照惯例,标记字符串是空格分隔的字符串.如reflect中所述:

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