溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Go語言之 Struct Tag

發(fā)布時(shí)間:2020-06-30 20:44:18 來源:網(wǎng)絡(luò) 閱讀:617 作者:baby神 欄目:編程語言

在上一篇介紹Go反射的時(shí)候,提到了如何通過反射獲取Struct的Tag,這一篇文章主要就是介紹這個(gè)的使用和原理,在介紹之前我們先看一下JSON字符串和Struct類型相互轉(zhuǎn)換的例子。


JSON字符串對象轉(zhuǎn)換


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`
}


上面這個(gè)例子就是Json字符串轉(zhuǎn)User對象的例子,這里主要利用的就是User這個(gè)結(jié)構(gòu)體對應(yīng)的字段Tag,json解析的原理就是通過反射獲得每個(gè)字段的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)為一個(gè)新的字符串了,通過打印輸出,可以看到和開始輸入的字符串一樣。


反射獲取字段Tag


字段的Tag是標(biāo)記到字段上的,所以我們可以通過先獲取字段,然后再獲取字段上的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)
    }
}


獲取字段上一篇我們提到過,獲取字段后,調(diào)用.Tag就獲取到對應(yīng)的Tag字段了。


字段Tag的鍵值對


很多時(shí)候我們的一個(gè)Struct不止具有一個(gè)功能,比如我們需要JSON的互轉(zhuǎn)、還需要BSON以及ORM解析的互轉(zhuǎn),所以一個(gè)字段可能對應(yīng)多個(gè)不同的Tag,以便滿足不同的功能場景。


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,所以我們可以通過這個(gè)Key獲取對應(yīng)的值,也就是通過.Tag.Get("json"))方法。Get方法就是通過一個(gè)Key獲取對應(yīng)的tag設(shè)置。


除此之外,我們還可以設(shè)置多個(gè)Key,來滿足我們上面說的場景。


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"`
}


多個(gè)Key使用空格進(jìn)行分開,然后使用Get方法獲取不同Key的值。


Struct Tag可以提供字符串到Struct的映射能力,以便我們作轉(zhuǎn)換,除此之外,還可以作為字段的元數(shù)據(jù)的配置,提供我們需要的配置,比如生成Swagger文檔等。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI