在上一篇介紹Go反射的時候,提到了如何經過反射獲取Struct的Tag,這一篇文章主要就是介紹這個的使用和原理,在介紹以前咱們先看一下JSON字符串和Struct類型相互轉換的例子。json
func main() { var u User h:=`{"name":"張三","age":15}` err:=json.Unmarshal([]byte(h),&u) if err!=nil{ fmt.Println(err) }else { fmt.Println(u) }
}
type User struct{ Name string `name` Age int `age`
}
上面這個例子就是Json字符串轉User對象的例子,這裏主要利用的就是User這個結構體對應的字段Tag,json解析的原理就是經過反射得到每一個字段的tag,而後把解析的json對應的值賦給他們。ide
利用字段Tag不光能夠把Json字符串轉爲結構體對象,還能夠把結構體對象轉爲Json字符串。spa
newJson,err:=json.Marshal(&u) fmt.Println((string(newJson)))
接着剛剛的例子,這樣就能夠轉爲一個新的字符串了,經過打印輸出,能夠看到和開始輸入的字符串同樣。code
字段的Tag是標記到字段上的,因此咱們能夠經過先獲取字段,而後再獲取字段上的Tag。orm
func main() { var u User t:=reflect.TypeOf(u) for i:=0;i<t.NumField();i++{ sf:=t.Field(i) fmt.Println(sf.Tag) }
}
獲取字段上一篇咱們提到過,獲取字段後,調用.Tag就獲取到對應的Tag字段了。對象
不少時候咱們的一個Struct不止具備一個功能,好比咱們須要JSON的互轉、還須要BSON以及ORM解析的互轉,因此一個字段可能對應多個不一樣的Tag,以便知足不一樣的功能場景。ci
Go Struct 爲咱們提供了鍵值對的Tag,來知足咱們以上的需求。文檔
func main() { var u User t:=reflect.TypeOf(u) for i:=0;i<t.NumField();i++{ sf:=t.Field(i) fmt.Println(sf.Tag.Get("json")) }
}
type User struct{ Name string `json:"name"` Age int `json:"age"`
}
以上的例子,使用了鍵值對的方式配置Struct Tag,Key-Value以冒號分開,這裏的Key爲json,因此咱們能夠經過這個Key獲取對應的值,也就是經過.Tag.Get("json"))方法。Get方法就是經過一個Key獲取對應的tag設置。字符串
除此以外,咱們還能夠設置多個Key,來知足咱們上面說的場景。string
func main() { var u User t:=reflect.TypeOf(u) for i:=0;i<t.NumField();i++{ sf:=t.Field(i) fmt.Println(sf.Tag.Get("json"),",",sf.Tag.Get("bson")) }
}
type User struct{ Name string `json:"name" bson:"b_name"` Age int `json:"age" bson:"b_age"`
}
多個Key使用空格進行分開,而後使用Get方法獲取不一樣Key的值。
Struct Tag能夠提供字符串到Struct的映射能力,以便咱們做轉換,除此以外,還能夠做爲字段的元數據的配置,提供咱們須要的配置,好比生成Swagger文檔等。