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

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

我明白前两列是什么,但json:"commitIndex"是什么意思?

2个回答

48

这被称为结构体标签,它们可以在运行时使用reflect包进行解析。

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

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

标记通过反射接口变得可见,并参与结构体类型标识,但在其他情况下被忽略。

一些使用反射的软件包,如jsonxml,使用标签更好地处理特殊情况。


23
你所指的是被称为“标签”的东西,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"
}

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

按照约定,标签字符串是一个由空格分隔的字符串。就像reflect中所述:

按照惯例,标签字符串是可选地由空格分隔的key:"value"对的串联。每个键是非空字符串,由非控制字符(除了空格(U+0020 ' ')、引号(U+0022 '"')和冒号(U+003A ':')之外的字符)组成。每个值都使用 U+0022 '"' 字符和 Go 字符串字面值语法进行引用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接