type Config struct {
CommitIndex uint64 `json:"commitIndex"`
// TODO decide what we need to store in peer struct
Peers []*Peer `json:"peers"`
}
我明白前两列是什么,但json:"commitIndex"
是什么意思?
type Config struct {
CommitIndex uint64 `json:"commitIndex"`
// TODO decide what we need to store in peer struct
Peers []*Peer `json:"peers"`
}
我明白前两列是什么,但json:"commitIndex"
是什么意思?
这被称为结构体标签,它们可以在运行时使用reflect
包进行解析。
来自https://golang.org/ref/spec#Struct_types:
字段声明后面可以跟随一个可选的字符串文字标记,它成为相应字段声明中所有字段的属性。
标记通过反射接口变得可见,并参与结构体类型标识,但在其他情况下被忽略。
// 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/xml
、gopkg.in/mgo.v2/bson
等也是如此。
按照约定,标签字符串是一个由空格分隔的字符串。就像reflect
包中所述:
按照惯例,标签字符串是可选地由空格分隔的key:"value"对的串联。每个键是非空字符串,由非控制字符(除了空格(U+0020 ' ')、引号(U+0022 '"')和冒号(U+003A ':')之外的字符)组成。每个值都使用 U+0022 '"' 字符和 Go 字符串字面值语法进行引用。