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)
}
}
這些標簽也起到配置信息的作用,不過在實際工作中,為了代碼更直觀,這些應該放到配置信息里。
————————————————
原文鏈接:https://blog.csdn.net/benben_2015/java/article/details/79807792