[Golang] struct Tag说明
生活随笔
收集整理的這篇文章主要介紹了
[Golang] struct Tag说明
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在處理json格式字符串的時候,經常會看到聲明struct結構的時候,屬性的右側還有小米點括起來的內容。形如
type User struct {UserId int `json:"user_id" bson:"user_id"`UserName string `json:"user_name" bson:"user_name"` }?
struct成員變量標簽(Tag)說明
要比較詳細的了解這個,要先了解一下golang的基礎,在golang中,命名都是推薦都是用駝峰方式,并且在首字母大小寫有特殊的語法含義:包外無法引用。但是由經常需要和其它的系統進行數據交互,例如轉成json格式,存儲到mongodb啊等等。這個時候如果用屬性名來作為鍵值可能不一定會符合項目要求。
所以呢就多了小米點的內容,在golang中叫標簽(Tag),在轉換成其它數據格式的時候,會使用其中特定的字段作為鍵值。例如上例在轉成json格式:
?
u := &User{UserId: 1, UserName: "tony"} j, _ := json.Marshal(u) fmt.Println(string(j)) // 輸出內容:{"user_id":1,"user_name":"tony"}?如果在屬性中不增加標簽說明,則輸出:
{"UserId":1,"UserName":"tony"}?
可以看到直接用struct的屬性名做鍵值。
其中還有一個bson的聲明,這個是用在將數據存儲到mongodb使用的。
?
struct成員變量標簽(Tag)獲取
那么當我們需要自己封裝一些操作,需要用到Tag中的內容時,如何去獲取呢?這邊可以使用反射包(reflect)中的方法來獲取:
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))// 輸出內容:{"user_id":1,"user_name":"tony"}// 獲取tag中的內容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中也通過tag來定義參數的。
?
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" //這引號里面的就是tagPasswd string "user passsword" }func main() {user := &User{"chronos", "pass"}s := reflect.TypeOf(user).Elem() //通過反射獲取type定義for i := 0; i < s.NumField(); i++ {fmt.Println(s.Field(i).Tag) //將tag輸出出來} }?
總結
以上是生活随笔為你收集整理的[Golang] struct Tag说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022十一股市休市安排,10月1日至1
- 下一篇: 锂电池长时间不充电会坏吗