Go 結構體標籤詳解
阿新 • • 發佈:2018-12-01
Go 結構體標籤詳解
版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/benben_2015/article/details/79807792
Go結構體標籤
結構體的欄位除了名字和型別外,還可以有一個可選的標籤(tag):它是一個附屬於欄位的字串,可以是文件或其他的重要標記。比如在我們解析json或生成json檔案時,常用到encoding/json包,它提供一些預設標籤,例如:omitempty
標籤可以在序列化的時候忽略0值或者空值。而-
標籤的作用是不進行序列化,其效果和和直接將結構體中的欄位寫成小寫的效果一樣。
type Info struct { Name string Age int `json:"age,omitempty"` Sex string }
在序列化和反序列化的時候,也支援型別轉化等操作。如
type Info struct {
Name string
Age int `json:"age,string"`
//這樣生成的json物件中,age就為字串
Sex string
}
現在來了解下如何設定自定義的標籤,以及如何像官方包一樣,可以通過標籤,對欄位進行自定義處理。要實現這些,我們要用到reflect
包。
package main import ( "fmt" "reflect" ) const tagName = "Testing" type Info struct { Name string `Testing:"-"` Age int `Testing:"age,min=17,max=60"` Sex string `Testing:"sex,required"` } func main() { info := Info{ Name: "benben", Age: 23, Sex: "male", } //通過反射,我們獲取變數的動態型別 t := reflect.TypeOf(info) fmt.Println("Type:", t.Name()) fmt.Println("Kind:", t.Kind()) for i := 0; i < t.NumField(); i++ { field := t.Field(i) //獲取結構體的每一個欄位 tag := field.Tag.Get(tagName) fmt.Printf("%d. %v (%v), tag: '%v'\n", i+1, field.Name, field.Type.Name(), tag) } }
這些標籤也起到配置資訊的作用,不過在實際工作中,為了程式碼更直觀,這些應該放到配置資訊裡。