Golang 語言 Struct 中字段的 Tag 怎么使用?
01介紹
在 Golang 語言中,我們可以使用反單引號為 Struct 中的字段設置 Tag,通過 Tag 可以為 Struct 中的字段定義附加屬性。Tag 實際上就是一個字符串,只不過有特定的格式,也就是說 Tag 字符串必須由 key:"value"組成,key 必須是非空字符串,value 必須由雙引號引起來。
其中,每個 key 都是一個非空字符串,由除空格 (U+0020 ' ')、引號 (U+0022 '"') 和冒號 (U+003A ':') 以外的非控制字符組成;每個 value 都使用 U+0022 '"' 字符和 Go 字符串語法引用。
示例代碼:
- type User struct {
- Id uint64 `json:"id"`
- Name string `json:"name"`
- }
02操作 Struct 字段中的 Tag
在 Golang 語言中,可以使用標準庫 reflect 包操作 Struct 中的 Tag。在 reflect 包中,使用一個 StructField 表示 Struct 中的一個字段。
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 中的一個字段的組成部分,Tag 的類型是 StructTag,實際上它是一個 string 類型的別名。
- type StructTag string
StructTag 提供了 Get 方法 func (tag StructTag) Get(key string) string,可以通過給定參數 key 獲取關聯 value 的值。如果 Tag 中沒有該 key,Get 返回空字符串。
示例代碼:
- func GetTag () {
- u := User{}
- ut := reflect.TypeOf(u)
- for i := 0; i < ut.NumField(); i++ {
- fmt.Printf("字段:%s,標簽:%s\n", ut.Field(i).Name, ut.Field(i).Tag.Get("json"))
- }
- }
其實,標準庫 json 包轉換 struct 為 JSON 字符串也是使用的類似的方法。
03總結
本文我們介紹了 Struct 字段中的 Tag 是什么,同時介紹了如何使用標準庫 reflect 包操作 Struct 字段中的 Tag,實際上 Tag 只是一個字符串,reflect 包可以通過 Tag 作為參考條件,操作 Struct 字段。關于 reflect 包的更多介紹,感興趣的讀者可以翻閱之前的文章。
本文轉載自微信公眾號「Golang語言開發棧」,可以通過以下二維碼關注。轉載本文請聯系Golang語言開發棧公眾號。