tag是結構體的元資訊,可以在執行的時候通過反射機制讀取出來
1、tag定義格式:(tag在結構體字段的後方定義,由一對反引號包裹起來,不同的鍵值對之間使用空格分隔)
`key1:"value1" key2:"value2"`
2、指定欄位名(序列化與反序列化預設情況下使用結構體的欄位名,我們可以通過給結構體欄位新增tag來指定json序列化生成的欄位名)
// 使用json tag指定json序列化與反序列化時的行為
type person struct
3、忽略某個字段(如果你想在json序列化/反序列化的時候忽略掉結構體中的某個字段)
// 使用json tag指定json序列化與反序列化時的行為
type person struct
4、忽略空值字段
當 struct 中的字段沒有值時, json.marshal() 序列化的時候不會忽略這些字段,而是預設輸出欄位的型別零值
(例如int和float型別零值是 0,string型別零值是"",物件型別零值是 nil)。
如果想要在序列序列化時忽略這些沒有值的字段時,可以在對應字段新增omitempty tag。
// 在tag中新增omitempty忽略空值
// 注意這裡 hobby,omitempty 合起來是json tag值,中間用英文逗號分隔
type user struct
func main()
// struct -> json string
str_user, err := json.marshal(user)
if err != nil
fmt.printf("str_user:%s\n", str_user)
// 列印結果 str_user:
// 如果不設定omitempty str_user:
}5、結構體巢狀空值字段處理
type person struct
type user struct
func main() ,
} str_user, err := json.marshal(user)
if err != nil
// 列印結果: str_user:
fmt.printf("str_user:%s\n", str_user)
// (1)巢狀person序列化後的json串為單層,想要變成巢狀的json串,需要改為具名巢狀
// type user struct
// 列印結果 str_user:}
// (2)想要在巢狀的結構體為空值時,忽略該欄位,僅新增omitempty是不夠的,還需要使用巢狀結構體的指標
// type user struct
// 列印結果 str_user:
}6、我們需要json序列化user,但是不想把密碼也序列化,又不想修改user結構體
我們可以建立另外乙個結構體publicuser,巢狀原user,同時指定password欄位為結構體指標型別,並新增omitempty tag
示例如下:
type user struct
type publicuser struct `json:"password,omitempty"`
}func main()
str_user, err := json.marshal(publicuser)
if err != nil
// 序列化結果 str_user:
fmt.printf("str_user:%s\n", str_user)
}7、優雅處理字串格式的數字
前端在傳遞來的json資料中可能會使用字串型別的數字,這個時候可以在結構體tag中新增string來告訴json包從字串中解析相應欄位的資料
type card struct
func main() `
var card card
if err := json.unmarshal(byte(str_json), &card); err != nil
// 列印結果:card:main.card
fmt.printf("card:%#v\n", card)
}8、整數變浮點數
golang結構體tag的使用
tag是結構體的元資訊,可以在執行的時候通過反射機制讀取出來 1 tag定義格式 tag在結構體字段的後方定義,由一對反引號包裹起來,不同的鍵值對之間使用空格分隔 key1 value1 key2 value2 2 指定欄位名 序列化與反序列化預設情況下使用結構體的欄位名,我們可以通過給結構體欄位新...
golang 結構體的使用
package main import fmt unsafe type person struct type student struct func test man person func main fmt.println man man 2.部分初始化 man2 person fmt.print...
Golang中struct結構標籤 Tag 的使用
在看別人的一些 時,宣告結構時有個json name是做什麼用的?想知道原因得了解下 在golang中,命名都是推薦都是用駝峰方式,並且在首字母大小寫有特殊的語法含義 包外無法引用。但是由經常需要和其它的系統進行資料互動,例如轉成json格式,儲存到redis等等。這個時候如果直接用屬性名來作為鍵值...