Go語言之 Struct Tag

在上一篇介紹Go反射的時候,提到了如何經過反射獲取Struct的Tag,這一篇文章主要就是介紹這個的使用和原理,在介紹以前咱們先看一下JSON字符串和Struct類型相互轉換的例子。json


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是標記到字段上的,因此咱們能夠經過先獲取字段,而後再獲取字段上的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字段了。對象


字段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文檔等。

相關文章
相關標籤/搜索