成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Golang 的 “omitempty” 關鍵字詳解

開發 前端
omitempty只是在把結構體轉換成json的過程中,「只會影響json轉換后的結果,并不是影響結構體本身」,所以結構體的任何屬性設置了omitempty之后,都不影響其正常使用。

?json和struct轉換簡單介紹

熟悉 Golang 的朋友對于 json 和 struct 之間的轉換一定不陌生,為了將代碼中的結構體與 json 數據解耦,通常我們會在結構體的 field 類型后加上解釋說明,注意:「結構體的屬性首字母必須大寫,否則json解析會不生效」。

type Person struct {
Name string `json:"json_key_name"`
Age int `json:"json_key_age"`
}

func main() {

Per := Person{
Name: "小飯",
Age: 18,
}

res, _ := json.Marshal(Per)
fmt.Println(string(res))
return
}
//輸出結果
{"json_key_name":"小飯","json_key_age":18}

結構體只初始化部分變量?

接下來我們看另外一種情況:

p := Person{
Name: "小飯",
}
res, _ := json.Marshal(p)
fmt.Println(string(res))

如果我們在結構體初始化的時候只初始化了其中一個字段Name,那么理論上來說返回的json應該是。

{"Name":"小飯"}

但是我們實際運行一下返回的結果卻是。

{"Name":"小飯","Age":0}

這明顯是不符合我們的預期的,因為Age字段是我們不需要的。

如何解決?

接下來就輪到咱們今天的主角登場了,解決方式很簡單,在后面加上「omitempty」即可。

type Person struct {
Name string
Age int `json:",omitempty"`
}
func main() {
p := Person{
Name: "小飯",
}
res, _ := json.Marshal(p)
fmt.Println(string(res))
}
//輸出結果
{"Name":"小飯"}

結構體的特殊情況?

我們再來看下面的這個例子:

type Person struct {
Name string
Age int
}

type Student struct {
Num int
Person Person `json:",omitempty"` //對結構體person使用了omitempty
}

func main() {
Stu := Student{
Num: 5,
}
res, _ := json.Marshal(Stu)
fmt.Println(string(res))
}

我們對結構體「Person定義了omitempty」,按理說我們在初始化的時候并「沒有初始化結構體的任何屬性」,所以轉換成json之后的打印結果應該是只有{"Num":5}的,但是我們實際運行之后發現打印的結果卻是。

{"Num":5,"Person":{"Name":"","Age":0}}

為什么「omitempty對于結構體類型不生效」了呢?「這是因為結構體(上面例子的Person)不知道空值是什么,GO只知道簡單結構體例如int,string,pointer 這種類型的空值」,為了不顯示我們沒有提供值的自定義結構體,我們可以使用「結構體指針」。

為什么用指針類型就可以解決這個問題?因為「指針是基本類型,Golang知道他的空值是啥」,所以就直接賦值為nil(指針類型的空值)。

type Person struct {
Name string
Age int
}

type Student struct {
Num int
Person *Person `json:",omitempty"` //如果想要omitempty生效,必須是指針類型
}

func main() {
Stu := Student{
Num: 5,
}
res, _ := json.Marshal(Stu)
fmt.Println(string(res))
}
//輸出結果
{"Num":5}

omitempty的一個大坑?

我們接下來還是看例子:

type Person struct {
Age int `json:",omitempty"`
}
func main() {
Per := Person{
Age: 0,
}
res, _ := json.Marshal(Per)
fmt.Println(string(res))
}

按照咱們的預期,應該給輸出。

{"Age":0}

對不對,但是咱們實際運行以后輸出的卻是。

{}

這明顯有問題啊,咱們需要的是輸出的json字段,是必須有age,而且值是0,現在什么都沒輸出明顯是有問題的。「因為Golang把0當成了零值,所以跟沒有賦值是一樣的」如果想解決這種問題一種方法是「使用int指針」,因為int指針的空值為nil,當我想輸出0的時候,我傳進去地址,地址肯定不是空值nil,這樣肯定會顯示出來0。

type Person struct {
Age *int `json:",omitempty"`
}

func main() {
age := 0
Per := Person{
Age: &age,
}
res, _ := json.Marshal(Per)
fmt.Println(string(res))
}

總結?

omitempty只是在把結構體轉換成json的過程中,「只會影響json轉換后的結果,并不是影響結構體本身」,所以結構體的任何屬性設置了omitempty之后,都不影響其正常使用。

omitempty的作用簡單來說就是在「結構體轉換json的過程中」,「把沒有賦值的結構體屬性不在json中輸出而已」。

omitempty只支持「簡單的數據類型」,對「結構體的數據類型是不生效」的,如果需要生效,只能用「結構體指針」。

omitempty分不清楚「0值,""值和未賦值」,「如果給某個屬性賦值0或者"",并且想輸出,只能用指針類型」。

責任編輯:武曉燕 來源: 程序員小飯
相關推薦

2021-02-01 13:10:07

Staticc語言UNIX系統

2009-09-02 09:24:03

C# this關鍵字

2013-01-30 10:12:14

Pythonyield

2009-09-28 11:34:49

Javascript

2011-06-14 13:26:27

volatile

2025-06-13 08:00:00

Java并發編程volatile

2021-07-27 07:31:16

單例模式關鍵字

2017-05-27 20:59:30

Java多線程synchronize

2010-02-05 15:51:06

C++ explici

2023-03-09 07:38:58

static關鍵字狀態

2023-11-10 09:29:30

MySQLExplain

2024-03-15 11:52:03

C++關鍵字編程

2023-09-22 22:27:54

autoC++11

2024-01-15 10:41:31

C++關鍵字開發

2024-03-15 15:12:27

關鍵字底層代碼

2022-02-17 08:31:38

C語言staic關鍵字

2025-01-09 10:30:40

2022-05-06 08:32:40

Pythonwith代碼

2009-08-21 14:58:56

C# this關鍵字

2018-04-20 15:56:09

Pythonglobal關鍵字
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一级久久 | 99免费视频 | 99亚洲精品 | 天天天操操操 | 日韩一区二区三区视频在线播放 | 亚洲精品456 | 免费永久av| 成人av网站在线观看 | 精品av久久久久电影 | 亚洲欧洲精品成人久久奇米网 | 国产999在线观看 | 免费观看av网站 | 国产精品久久久久久久久久久久午夜片 | 亚洲一区三区在线观看 | 成人毛片网站 | 国产精品精品视频一区二区三区 | 四虎最新地址 | 久久精品在线免费视频 | 天天操夜夜爽 | 伊人精品| 九九免费视频 | 日韩中文在线观看 | 一区二区三区四区在线视频 | 日韩精品一区二区三区 | 欧美日韩亚洲二区 | 久久9999久久 | 国产精品一区一区 | 欧美一区二区三区在线观看 | 免费在线观看av网站 | 亚洲国产高清在线观看 | 亚洲91视频 | 少妇无套高潮一二三区 | 成人国产精品色哟哟 | 婷婷综合五月天 | 免费国产成人av | 欧美三级视频在线观看 | 精品国产乱码久久久久久中文 | 国家aaa的一级看片 h片在线看 | 久久精品国产99国产 | 亚洲精品乱码久久久久久蜜桃91 | www.色午夜.com |