在上一篇介紹Go反射的時候,提到了如何通過反射獲取Struct的Tag,這一篇文章主要就是介紹這個的使用和原理,在介紹之前我們先看一下JSON字符串和Struct類型相互轉(zhuǎn)換的例子。
成都創(chuàng)新互聯(lián)公司主要從事網(wǎng)站設(shè)計制作、網(wǎng)站制作、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)界首,十余年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575
func main(){ var uUser h:=`{"name":"張三","age":15}` err:=json.Unmarshal([]byte(h),&u)
if err!=nil{ fmt.Println(err) }else{ fmt.Println(u) }
}
typeUserstruct{ Namestring`name` Ageint`age`
}
上面這個例子就是Json字符串轉(zhuǎn)User對象的例子,這里主要利用的就是User這個結(jié)構(gòu)體對應(yīng)的字段Tag,json解析的原理就是通過反射獲得每個字段的tag,然后把解析的json對應(yīng)的值賦給他們。
利用字段Tag不光可以把Json字符串轉(zhuǎn)為結(jié)構(gòu)體對象,還可以把結(jié)構(gòu)體對象轉(zhuǎn)為Json字符串。
newJson,err:=json.Marshal(&u) fmt.Println((string(newJson)))
接著剛剛的例子,這樣就可以轉(zhuǎn)為一個新的字符串了,通過打印輸出,可以看到和開始輸入的字符串一樣。
字段的Tag是標記到字段上的,所以我們可以通過先獲取字段,然后再獲取字段上的Tag。
func main(){ var uUser
t:=reflect.TypeOf(u)
for i:=0;i }
獲取字段上一篇我們提到過,獲取字段后,調(diào)用.Tag就獲取到對應(yīng)的Tag字段了。
很多時候我們的一個Struct不止具有一個功能,比如我們需要JSON的互轉(zhuǎn)、還需要BSON以及ORM解析的互轉(zhuǎn),所以一個字段可能對應(yīng)多個不同的Tag,以便滿足不同的功能場景。
Go Struct 為我們提供了鍵值對的Tag,來滿足我們以上的需求。
func main(){ var uUser t:=reflect.TypeOf(u)
for i:=0;i }
typeUserstruct{ Namestring`json:"name"` Ageint`json:"age"`
}
以上的例子,使用了鍵值對的方式配置Struct Tag,Key-Value以冒號分開,這里的Key為json,所以我們可以通過這個Key獲取對應(yīng)的值,也就是通過.Tag.Get("json"))方法。Get方法就是通過一個Key獲取對應(yīng)的tag設(shè)置。
除此之外,我們還可以設(shè)置多個Key,來滿足我們上面說的場景。
func main(){ var uUser t:=reflect.TypeOf(u)
for i:=0;i }
typeUserstruct{ Namestring`json:"name" bson:"b_name"` Ageint`json:"age" bson:"b_age"`
}
多個Key使用空格進行分開,然后使用Get方法獲取不同Key的值。
Struct Tag可以提供字符串到Struct的映射能力,以便我們作轉(zhuǎn)換,除此之外,還可以作為字段的元數(shù)據(jù)的配置,提供我們需要的配置,比如生成Swagger文檔等。