omitempty在go中的使用方式
omitempty在go中的使用
直接上代碼:
package main import ( "encoding/json" "fmt" ) type Person struct { Name string `json:"name"` Age int `json:"age"` Addr string `json:"addr,omitempty"` } func main() { p1 := Person{ Name: "taoge", Age: 30, } data, err := json.Marshal(p1) if err != nil { panic(err) } fmt.Printf("%s\n", data) fmt.Println(p1.Name, p1.Age, p1.Addr) p2 := Person{ Name: "Cang Laoshi", Age: 18, Addr: "Japan", } data2, err := json.Marshal(p2) if err != nil { panic(err) } fmt.Printf("%s\n", data2) fmt.Println(p2.Name, p2.Age, p2.Addr) }
結(jié)果:
{"name":"taoge","age":30}
taoge 30
{"name":"Cang Laoshi","age":18,"addr":"Japan"}
Cang Laoshi 18 Japan
可以看到,有了omitempty后,如果addr為空, 則生成的json中沒(méi)有addr字段。
可以去掉omitempty, 再試試。
go標(biāo)記omitempty的含義
"omitempty"是Go語(yǔ)言中的一個(gè)標(biāo)記,用于在編碼和解碼JSON數(shù)據(jù)時(shí)控制字段的行為。它可以應(yīng)用于結(jié)構(gòu)體字段的標(biāo)簽中。
當(dāng)字段被標(biāo)記為"`omitempty`"時(shí),它表示在編碼JSON數(shù)據(jù)時(shí),如果該字段的值為空值,即零值或空引用,則忽略該字段,不將其包含在生成的JSON中。換句話說(shuō),如果字段的值為零值或空引用,則不會(huì)在JSON中創(chuàng)建對(duì)應(yīng)的鍵值對(duì)。
這個(gè)特性對(duì)于減少生成的JSON大小、提高網(wǎng)絡(luò)傳輸效率以及使JSON數(shù)據(jù)更加簡(jiǎn)潔和可讀是有用的。
以下是一個(gè)示例,展示了如何在Go語(yǔ)言的結(jié)構(gòu)體字段中使用"`omitempty`"標(biāo)記:
type Person struct { Name string `json:"name"` Age int `json:"age,omitempty"` Email string `json:"email,omitempty"` }
在上述示例中,`Age`和`Email`字段都被標(biāo)記為`omitempty`。當(dāng)將`Person`結(jié)構(gòu)體編碼為JSON時(shí),如果`Age`和`Email`字段的值為空值(例如,`Age`為0,`Email`為空字符串),則在生成的JSON中將不會(huì)包含這些字段。只有當(dāng)它們具有非空值時(shí),才會(huì)在JSON中創(chuàng)建對(duì)應(yīng)的鍵值對(duì)。
總之,`omitempty`是Go語(yǔ)言中用于在編碼和解碼JSON時(shí)控制字段行為的標(biāo)記,它指示在生成的JSON中忽略空值字段。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
go使用SQLX操作MySQL數(shù)據(jù)庫(kù)的教程詳解
sqlx 是 Go 語(yǔ)言中一個(gè)流行的操作數(shù)據(jù)庫(kù)的第三方包,它提供了對(duì) Go 標(biāo)準(zhǔn)庫(kù) database/sql 的擴(kuò)展,簡(jiǎn)化了操作數(shù)據(jù)庫(kù)的步驟,下面我們就來(lái)學(xué)習(xí)一下go如何使用SQLX實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)的一些基本操作吧2023-11-11GoLang中的timer定時(shí)器實(shí)現(xiàn)原理分析
Timer中對(duì)外暴露的只有一個(gè)channel,這個(gè) channel也是定時(shí)器的核心。當(dāng)計(jì)時(shí)結(jié)束時(shí),Timer會(huì)發(fā)送值到channel中,外部環(huán)境在這個(gè) channel 收到值的時(shí)候,就代表計(jì)時(shí)器超時(shí)了,可與select搭配執(zhí)行一些超時(shí)邏輯2023-02-02使用Go語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的無(wú)界資源池
本文我們希望通過(guò)go語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的資源池,而這個(gè)資源池的資源包括但不限于數(shù)據(jù)庫(kù)連接池,線程池,協(xié)程池,網(wǎng)絡(luò)連接池,只要這些資源實(shí)現(xiàn)我們指定的關(guān)閉方法,則都可以通過(guò)我們封裝的資源池進(jìn)行統(tǒng)一管理,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-05-05GoFrame框架數(shù)據(jù)校驗(yàn)之校驗(yàn)結(jié)果Error接口對(duì)象
這篇文章主要為大家介紹了GoFrame框架數(shù)據(jù)校驗(yàn)之校驗(yàn)結(jié)果Error接口對(duì)象示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06go貨幣計(jì)算時(shí)如何避免浮點(diǎn)數(shù)精度問(wèn)題
在開(kāi)發(fā)的初始階段,我們經(jīng)常會(huì)遇到“浮點(diǎn)數(shù)精度”和“貨幣值表示”的問(wèn)題,那么在golang中如何避免這一方面的問(wèn)題呢,下面就跟隨小編一起來(lái)學(xué)習(xí)一下吧2024-02-02詳解Go如何實(shí)現(xiàn)協(xié)程并發(fā)執(zhí)行
線程是通過(guò)本地隊(duì)列,全局隊(duì)列或者偷其它線程的方式來(lái)獲取協(xié)程的,目前看來(lái),線程運(yùn)行完一個(gè)協(xié)程后再?gòu)年?duì)列中獲取下一個(gè)協(xié)程執(zhí)行,還只是順序執(zhí)行協(xié)程的,而多個(gè)線程一起這么運(yùn)行也能達(dá)到并發(fā)的效果,接下來(lái)就給給大家詳細(xì)介紹一下Go如何實(shí)現(xiàn)協(xié)程并發(fā)執(zhí)行2023-08-08