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

Golang 的 “omitempty” 關(guān)鍵字詳解

開發(fā) 前端
omitempty只是在把結(jié)構(gòu)體轉(zhuǎn)換成json的過(guò)程中,「只會(huì)影響json轉(zhuǎn)換后的結(jié)果,并不是影響結(jié)構(gòu)體本身」,所以結(jié)構(gòu)體的任何屬性設(shè)置了omitempty之后,都不影響其正常使用。

?json和struct轉(zhuǎn)換簡(jiǎn)單介紹

熟悉 Golang 的朋友對(duì)于 json 和 struct 之間的轉(zhuǎn)換一定不陌生,為了將代碼中的結(jié)構(gòu)體與 json 數(shù)據(jù)解耦,通常我們會(huì)在結(jié)構(gòu)體的 field 類型后加上解釋說(shuō)明,注意:「結(jié)構(gòu)體的屬性首字母必須大寫,否則json解析會(huì)不生效」。

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
}
//輸出結(jié)果
{"json_key_name":"小飯","json_key_age":18}

結(jié)構(gòu)體只初始化部分變量?

接下來(lái)我們看另外一種情況:

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

如果我們?cè)诮Y(jié)構(gòu)體初始化的時(shí)候只初始化了其中一個(gè)字段Name,那么理論上來(lái)說(shuō)返回的json應(yīng)該是。

{"Name":"小飯"}

但是我們實(shí)際運(yùn)行一下返回的結(jié)果卻是。

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

這明顯是不符合我們的預(yù)期的,因?yàn)锳ge字段是我們不需要的。

如何解決?

接下來(lái)就輪到咱們今天的主角登場(chǎng)了,解決方式很簡(jiǎn)單,在后面加上「omitempty」即可。

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

結(jié)構(gòu)體的特殊情況?

我們?cè)賮?lái)看下面的這個(gè)例子:

type Person struct {
Name string
Age int
}

type Student struct {
Num int
Person Person `json:",omitempty"` //對(duì)結(jié)構(gòu)體person使用了omitempty
}

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

我們對(duì)結(jié)構(gòu)體「Person定義了omitempty」,按理說(shuō)我們?cè)诔跏蓟臅r(shí)候并「沒有初始化結(jié)構(gòu)體的任何屬性」,所以轉(zhuǎn)換成json之后的打印結(jié)果應(yīng)該是只有{"Num":5}的,但是我們實(shí)際運(yùn)行之后發(fā)現(xiàn)打印的結(jié)果卻是。

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

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

為什么用指針類型就可以解決這個(gè)問(wèn)題?因?yàn)椤钢羔樖腔绢愋停珿olang知道他的空值是啥」,所以就直接賦值為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))
}
//輸出結(jié)果
{"Num":5}

omitempty的一個(gè)大坑?

我們接下來(lái)還是看例子:

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

按照咱們的預(yù)期,應(yīng)該給輸出。

{"Age":0}

對(duì)不對(duì),但是咱們實(shí)際運(yùn)行以后輸出的卻是。

{}

這明顯有問(wèn)題啊,咱們需要的是輸出的json字段,是必須有age,而且值是0,現(xiàn)在什么都沒輸出明顯是有問(wèn)題的。「因?yàn)镚olang把0當(dāng)成了零值,所以跟沒有賦值是一樣的」如果想解決這種問(wèn)題一種方法是「使用int指針」,因?yàn)閕nt指針的空值為nil,當(dāng)我想輸出0的時(shí)候,我傳進(jìn)去地址,地址肯定不是空值nil,這樣肯定會(huì)顯示出來(lái)0。

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

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

總結(jié)?

omitempty只是在把結(jié)構(gòu)體轉(zhuǎn)換成json的過(guò)程中,「只會(huì)影響json轉(zhuǎn)換后的結(jié)果,并不是影響結(jié)構(gòu)體本身」,所以結(jié)構(gòu)體的任何屬性設(shè)置了omitempty之后,都不影響其正常使用。

omitempty的作用簡(jiǎn)單來(lái)說(shuō)就是在「結(jié)構(gòu)體轉(zhuǎn)換json的過(guò)程中」,「把沒有賦值的結(jié)構(gòu)體屬性不在json中輸出而已」。

omitempty只支持「簡(jiǎn)單的數(shù)據(jù)類型」,對(duì)「結(jié)構(gòu)體的數(shù)據(jù)類型是不生效」的,如果需要生效,只能用「結(jié)構(gòu)體指針」。

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

責(zé)任編輯:武曉燕 來(lái)源: 程序員小飯
相關(guān)推薦

2021-02-01 13:10:07

Staticc語(yǔ)言UNIX系統(tǒng)

2009-09-02 09:24:03

C# this關(guān)鍵字

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并發(fā)編程volatile

2021-07-27 07:31:16

單例模式關(guān)鍵字

2024-03-15 11:52:03

C++關(guān)鍵字編程

2017-05-27 20:59:30

Java多線程synchronize

2010-02-05 15:51:06

C++ explici

2023-03-09 07:38:58

static關(guān)鍵字狀態(tài)

2023-11-10 09:29:30

MySQLExplain

2024-01-15 10:41:31

C++關(guān)鍵字開發(fā)

2023-09-22 22:27:54

autoC++11

2022-02-17 08:31:38

C語(yǔ)言staic關(guān)鍵字

2022-05-06 08:32:40

Pythonwith代碼

2025-01-09 10:30:40

2024-03-15 15:12:27

關(guān)鍵字底層代碼

2009-09-17 09:30:00

Linq LET關(guān)鍵字

2022-01-04 16:35:42

C++Protected關(guān)鍵字
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产一区二区三区四区三区四 | 亚洲精品一 | 免费久| 国产精品久久久久久久久久三级 | 亚洲一区二区三区 | 成人免费激情视频 | 午夜手机在线视频 | 成人日批视频 | 欧美区在线 | 999久久久久久久久 国产欧美在线观看 | 亚洲国产精品一区二区久久 | 久久久妇女国产精品影视 | 精品亚洲永久免费精品 | 国产精品久久久久久久久久免费看 | 一区中文字幕 | 欧美日韩中文国产一区发布 | 黄色毛片在线观看 | 日韩不卡在线 | 成人欧美一区二区三区白人 | 日本免费小视频 | 亚洲视频免费观看 | 久久精品二区 | 久久国产一区 | 国产精品久久久亚洲 | 亚洲精品国产成人 | 国产在线视频一区二区 | 亚洲国产aⅴ成人精品无吗 亚洲精品久久久一区二区三区 | 成人不卡视频 | 国产欧美日韩一区 | 日韩高清中文字幕 | 久久骚| 91av亚洲 | 在线观看黄色电影 | 午夜tv免费观看 | 欧美日韩亚洲国产 | 大乳boobs巨大吃奶挤奶 | 亚洲久久久 | 日日干日日 | 亚洲国产一区视频 | 国产午夜精品一区二区三区嫩草 | 日本欧美国产 |