[Golang] struct Tag说明
在處理json格式字符串的時(shí)候,經(jīng)常會(huì)看到聲明struct結(jié)構(gòu)的時(shí)候,屬性的右側(cè)還有小米點(diǎn)括起來(lái)的內(nèi)容。形如
type User struct {UserId int `json:"user_id" bson:"user_id"`UserName string `json:"user_name" bson:"user_name"` }?
struct成員變量標(biāo)簽(Tag)說(shuō)明
要比較詳細(xì)的了解這個(gè),要先了解一下golang的基礎(chǔ),在golang中,命名都是推薦都是用駝峰方式,并且在首字母大小寫有特殊的語(yǔ)法含義:包外無(wú)法引用。但是由經(jīng)常需要和其它的系統(tǒng)進(jìn)行數(shù)據(jù)交互,例如轉(zhuǎn)成json格式,存儲(chǔ)到mongodb啊等等。這個(gè)時(shí)候如果用屬性名來(lái)作為鍵值可能不一定會(huì)符合項(xiàng)目要求。
所以呢就多了小米點(diǎn)的內(nèi)容,在golang中叫標(biāo)簽(Tag),在轉(zhuǎn)換成其它數(shù)據(jù)格式的時(shí)候,會(huì)使用其中特定的字段作為鍵值。例如上例在轉(zhuǎn)成json格式:
?
u := &User{UserId: 1, UserName: "tony"} j, _ := json.Marshal(u) fmt.Println(string(j)) // 輸出內(nèi)容:{"user_id":1,"user_name":"tony"}?如果在屬性中不增加標(biāo)簽說(shuō)明,則輸出:
{"UserId":1,"UserName":"tony"}?
可以看到直接用struct的屬性名做鍵值。
其中還有一個(gè)bson的聲明,這個(gè)是用在將數(shù)據(jù)存儲(chǔ)到mongodb使用的。
?
struct成員變量標(biāo)簽(Tag)獲取
那么當(dāng)我們需要自己封裝一些操作,需要用到Tag中的內(nèi)容時(shí),如何去獲取呢?這邊可以使用反射包(reflect)中的方法來(lái)獲取:
t := reflect.TypeOf(u) field := t.Elem().Field(0) fmt.Println(field.Tag.Get("json")) fmt.Println(field.Tag.Get("bson"))?完整代碼如下:
package mainimport ("encoding/json""fmt""reflect" )func main() {type User struct {UserId int `json:"user_id" bson:"user_id"`UserName string `json:"user_name" bson:"user_name"`}// 輸出json格式u := &User{UserId: 1, UserName: "tony"}j, _ := json.Marshal(u)fmt.Println(string(j))// 輸出內(nèi)容:{"user_id":1,"user_name":"tony"}// 獲取tag中的內(nèi)容t := reflect.TypeOf(u)field := t.Elem().Field(0)fmt.Println(field.Tag.Get("json"))// 輸出:user_idfmt.Println(field.Tag.Get("bson"))// 輸出:user_id?
beego的ORM中也通過(guò)tag來(lái)定義參數(shù)的。
?
package mainimport ("fmt""reflect" )type Job struct {AlarmStatus *string `json:"alarm_status" name:"alarm_status"`CPUTopology string `json:"cpu_topology" name:"cpu_topology"` }func main(){a := "abc"s := Job{&a,"hello"}st := reflect.TypeOf(s)field := st.Field(1)fmt.Println(field.Tag.Get("json"), field.Tag.Get("name")) }?
package main import ("fmt""reflect" // 這里引入reflect模塊 )type User struct {Name string "user name" //這引號(hào)里面的就是tagPasswd string "user passsword" }func main() {user := &User{"chronos", "pass"}s := reflect.TypeOf(user).Elem() //通過(guò)反射獲取type定義for i := 0; i < s.NumField(); i++ {fmt.Println(s.Field(i).Tag) //將tag輸出出來(lái)} }?
總結(jié)
以上是生活随笔為你收集整理的[Golang] struct Tag说明的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2022十一股市休市安排,10月1日至1
- 下一篇: [机器学习] 二分类模型评估指标---精