Golang 語(yǔ)言 Struct 中字段的 Tag 怎么使用?
01介紹
在 Golang 語(yǔ)言中,我們可以使用反單引號(hào)為 Struct 中的字段設(shè)置 Tag,通過(guò) Tag 可以為 Struct 中的字段定義附加屬性。Tag 實(shí)際上就是一個(gè)字符串,只不過(guò)有特定的格式,也就是說(shuō) Tag 字符串必須由 key:"value"組成,key 必須是非空字符串,value 必須由雙引號(hào)引起來(lái)。
其中,每個(gè) key 都是一個(gè)非空字符串,由除空格 (U+0020 ' ')、引號(hào) (U+0022 '"') 和冒號(hào) (U+003A ':') 以外的非控制字符組成;每個(gè) value 都使用 U+0022 '"' 字符和 Go 字符串語(yǔ)法引用。
示例代碼:
- type User struct {
- Id uint64 `json:"id"`
- Name string `json:"name"`
- }
02操作 Struct 字段中的 Tag
在 Golang 語(yǔ)言中,可以使用標(biāo)準(zhǔn)庫(kù) reflect 包操作 Struct 中的 Tag。在 reflect 包中,使用一個(gè) StructField 表示 Struct 中的一個(gè)字段。
reflect 包源碼:
- type StructField struct {
- Name string
- PkgPath string
- Type Type // field type
- Tag StructTag // field tag string
- Offset uintptr // offset within struct, in bytes
- Index []int // index sequence for Type.FieldByIndex
- Anonymous bool // is an embedded field
- }
閱讀上面這段代碼,可以看出 Tag 也是 Struct 中的一個(gè)字段的組成部分,Tag 的類(lèi)型是 StructTag,實(shí)際上它是一個(gè) string 類(lèi)型的別名。
- type StructTag string
StructTag 提供了 Get 方法 func (tag StructTag) Get(key string) string,可以通過(guò)給定參數(shù) key 獲取關(guān)聯(lián) value 的值。如果 Tag 中沒(méi)有該 key,Get 返回空字符串。
示例代碼:
- func GetTag () {
- u := User{}
- ut := reflect.TypeOf(u)
- for i := 0; i < ut.NumField(); i++ {
- fmt.Printf("字段:%s,標(biāo)簽:%s\n", ut.Field(i).Name, ut.Field(i).Tag.Get("json"))
- }
- }
其實(shí),標(biāo)準(zhǔn)庫(kù) json 包轉(zhuǎn)換 struct 為 JSON 字符串也是使用的類(lèi)似的方法。
03總結(jié)
本文我們介紹了 Struct 字段中的 Tag 是什么,同時(shí)介紹了如何使用標(biāo)準(zhǔn)庫(kù) reflect 包操作 Struct 字段中的 Tag,實(shí)際上 Tag 只是一個(gè)字符串,reflect 包可以通過(guò) Tag 作為參考條件,操作 Struct 字段。關(guān)于 reflect 包的更多介紹,感興趣的讀者可以翻閱之前的文章。
本文轉(zhuǎn)載自微信公眾號(hào)「Golang語(yǔ)言開(kāi)發(fā)?!梗梢酝ㄟ^(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系Golang語(yǔ)言開(kāi)發(fā)棧公眾號(hào)。