Go語言之 Struct Tag
在上一篇介紹Go反射的時候,提到了如何透過反射獲取Struct的Tag,這一篇文章主要就是介紹這個的使用和原理,在介紹之前我們先看一下JSON字串和Struct型別相互轉換的例子。
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對應的值賦給他們。
利用欄位Tag不光可以把Json字串轉為結構體物件,還可以把結構體物件轉為Json字串。
newJson,err:=json.Marshal(&u) fmt.Println((string(newJson)))
接著剛剛的例子,這樣就可以轉為一個新的字串了,透過列印輸出,可以看到和開始輸入的字串一樣。
欄位的Tag是標記到欄位上的,所以我們可以透過先獲取欄位,然後再獲取欄位上的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) }
}
獲取欄位上一篇我們提到過,獲取欄位後,呼叫.Tag就獲取到對應的Tag欄位了。
很多時候我們的一個Struct不止具有一個功能,比如我們需要JSON的互轉、還需要BSON以及ORM解析的互轉,所以一個欄位可能對應多個不同的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,所以我們可以透過這個Key獲取對應的值,也就是透過.Tag.Get("json"))方法。Get方法就是透過一個Key獲取對應的tag設定。
除此之外,我們還可以設定多個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"`
}
多個Key使用空格進行分開,然後使用Get方法獲取不同Key的值。
Struct Tag可以提供字串到Struct的對映能力,以便我們作轉換,除此之外,還可以作為欄位的後設資料的配置,提供我們需要的配置,比如生成Swagger文件等。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2041/viewspace-2817682/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Go語言之methodGo
- Go語言之ContextGoContext
- Go語言之介面Go
- go語言之反射-------ReflectionGo反射
- 深度解密Go語言之Slice解密Go
- 深度解密 Go 語言之 channel解密Go
- 深度解密Go語言之channel解密Go
- 深度解密Go語言之context解密GoContext
- 深度解密Go語言之 map解密Go
- 深度解密 Go 語言之 context解密GoContext
- 深度解密GO語言之反射解密Go反射
- Go語言之包(package)管理GoPackage
- Go語言之讀寫鎖Go
- go語言之陣列與切片Go陣列
- Go語言之旅:基本型別Go型別
- Go語言之錯誤處理Go
- Go語言之併發示例(Runner)Go
- go語言之結構體和方法Go結構體
- 深度解密 Go 語言之 sync.map解密Go
- 深度解密 Go 語言之 sync.Pool解密Go
- 在 Fefora 上開啟 Go 語言之旅Go
- python和GO語言之間的區別!PythonGo
- Go語言之變數逃逸(Escape Analysis)分析Go變數
- Go語言之切片(slice)快速入門篇Go
- Go語言之陣列快速入門篇Go陣列
- 請教一個struct tag的問題Struct
- 為什麼 Go 語言 struct 要使用 tagsGoStruct
- 深入理解GO語言之併發機制Go
- Go語言之對映(map)快速入門篇Go
- Go語言之Goroutine與通道、異常處理Go
- Golang中struct結構標籤(Tag)的使用GolangStruct
- struct的tag到底可以用來做什麼?Struct
- Python和GO語言之間的區別是什麼?PythonGo
- Go語言中結構體打Tag是什麼意思?Go結構體
- 當 Go struct 遇上 MutexGoStructMutex
- 《碼農群英傳》連載(一) —— Go 語言之父 Rob PikeGo
- 深度解密Go語言之關於 interface 的10個問題解密Go
- Go 語言之對不同型別的資料進行分組Go型別