日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

[Golang] struct Tag说明

發(fā)布時(shí)間:2023/12/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Golang] struct Tag说明 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在處理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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。