Golang 中 omitempty的作用
前言
在嘗試將結(jié)構(gòu)體序列化為 Json 時(shí),你可能會(huì)遇到 “omitempty” 標(biāo)記,本小記就來(lái)淺看一下它如何起作用。
先上結(jié)論:
- 基本類(lèi)型的默認(rèn)值會(huì)被 omit,除了數(shù)組。
- 指針類(lèi)型為 nil 時(shí)會(huì)被 omit。
Talk is cheap. Show me the code.
package main
import (
"encoding/json"
"errors"
"fmt"
)
type TestNotOmitEmpty struct {
Uint8 uint8 `json:"uint8"`
Uint16 uint16 `json:"uint16"`
Uint32 uint32 `json:"uint32"`
Uint64 uint64 `json:"uint64"`
Int8 int8 `json:"int8"`
Int16 int16 `json:"int16"`
Int32 int32 `json:"int32"`
Int64 int64 `json:"int64"`
Int int `json:"int"`
Float32 float32 `json:"float32"`
Float64 float64 `json:"float64"`
// Complex64 complex64 `json:"complex64"` // json: unsupported type
// Complex128 complex128 `json:"complex128"` // json: unsupported type
Byte byte `json:"byte"`
Rune rune `json:"rune"`
Uintptr uintptr `json:"uintptr"`
String string `json:"string"`
StringPointer *string `json:"stringPointer"`
Array [10]int `json:"array"`
Slice []int `json:"slice"`
Map map[int]string `json:"map"`
// Channel chan int `json:"channel"` // json: unsupported type
Interface interface{} `json:"interface"`
Error error `json:"error"`
}
type TestOmitEmptyWithDefaultValue struct {
Uint8 uint8 `json:"uint8,omitempty"`
Uint16 uint16 `json:"uint16,omitempty"`
Uint32 uint32 `json:"uint32,omitempty"`
Uint64 uint64 `json:"uint64,omitempty"`
Int8 int8 `json:"int8,omitempty"`
Int16 int16 `json:"int16,omitempty"`
Int32 int32 `json:"int32,omitempty"`
Int64 int64 `json:"int64,omitempty"`
Int int `json:"int,omitempty"`
Float32 float32 `json:"float32,omitempty"`
Float64 float64 `json:"float64,omitempty"`
// Complex64 complex64 `json:"complex64,omitempty"` // json: unsupported type
// Complex128 complex128 `json:"complex128,omitempty"` // json: unsupported type
Byte byte `json:"byte,omitempty"`
Rune rune `json:"rune,omitempty"`
Uintptr uintptr `json:"uintptr,omitempty"`
String string `json:"string,omitempty"`
StringPointer *string `json:"stringPointer,omitempty"`
Array [10]int `json:"array,omitempty"`
Slice []int `json:"slice,omitempty"`
Map map[int]string `json:"map,omitempty"`
// Channel chan int `json:"channel,omitempty"` // json: unsupported type
Interface interface{} `json:"interface,omitempty"`
Error error `json:"error,omitempty"`
}
func ToStringPointer(s string) *string {
return &s
}
func main() {
testOmitEmpty := TestNotOmitEmpty{}
jsonData, err := json.Marshal(testOmitEmpty)
if err != nil {
println(err)
panic(err)
}
fmt.Printf("TestNotOmitEmpty: %s\n", jsonData)
testOmitEmptyWithDefaultValue := TestOmitEmptyWithDefaultValue{}
jsonData2, err := json.Marshal(testOmitEmptyWithDefaultValue)
if err != nil {
println(err)
panic(err)
}
fmt.Printf("TestOmitEmptyWithDefaultValue: %s\n", jsonData2)
testOmitEmptyWithDefaultValueButFatherSet := TestOmitEmptyWithDefaultValue{
Uint8: 0,
Uint16: 0,
Uint32: 0,
Uint64: 0,
Int8: 0,
Int16: 0,
Int32: 0,
Int64: 0,
Int: 0,
Float32: 0,
Float64: 0,
Byte: 0,
Rune: 0,
Uintptr: 0,
String: "",
StringPointer: nil,
Array: [10]int{},
Slice: nil,
Map: nil,
Interface: nil,
Error: nil,
}
jsonData3, err := json.Marshal(testOmitEmptyWithDefaultValueButFatherSet)
if err != nil {
println(err)
panic(err)
}
fmt.Printf("testOmitEmptyWithDefaultValueButFatherSet: %s\n", jsonData3)
testOmitEmptyWithNotDefaultValueButFatherSet := TestOmitEmptyWithDefaultValue{
Uint8: 1,
Uint16: 1,
Uint32: 1,
Uint64: 1,
Int8: 1,
Int16: 1,
Int32: 1,
Int64: 1,
Int: 1,
Float32: 1,
Float64: 1,
Byte: 1,
Rune: 1,
Uintptr: 1,
String: "1",
StringPointer: ToStringPointer(""),
Array: [10]int{1},
Slice: []int{1},
Map: map[int]string{1: "1"},
Interface: "1",
Error: errors.New("error"),
}
jsonData4, err := json.Marshal(testOmitEmptyWithNotDefaultValueButFatherSet)
if err != nil {
println(err)
panic(err)
}
fmt.Printf("testOmitEmptyWithNotDefaultValueButFatherSet: %s\n", jsonData4)
}TestNotOmitEmpty
全部序列化成功。

TestOmitEmptyWithDefaultValue
默認(rèn)值全軍覆沒(méi),除了數(shù)組。

testOmitEmptyWithDefaultValueButFatherSet
自己設(shè)置的默認(rèn)值也全軍覆沒(méi),除了數(shù)組。

testOmitEmptyWithNotDefaultValueButFatherSet
非默認(rèn)值當(dāng)然不會(huì)被省略了。

到此這篇關(guān)于Golang 中 omitempty的作用的文章就介紹到這了,更多相關(guān)Golang omitempty內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語(yǔ)言多人聊天室項(xiàng)目實(shí)戰(zhàn)
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言多人聊天室項(xiàng)目實(shí)戰(zhàn),實(shí)現(xiàn)單撩或多撩等多種功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08
Go語(yǔ)言中調(diào)用外部命令的方法總結(jié)
在工作中,我們時(shí)不時(shí)地會(huì)需要在Go中調(diào)用外部命令。本文為大家總結(jié)了Go語(yǔ)言中調(diào)用外部命令的幾種姿勢(shì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-11-11
go 代碼格式化和風(fēng)格開(kāi)發(fā)者指南
這篇文章主要為大家介紹了go 代碼格式化和風(fēng)格開(kāi)發(fā)者指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
Go語(yǔ)言常見(jiàn)錯(cuò)誤之誤用init函數(shù)實(shí)例解析
Go語(yǔ)言中的init函數(shù)為開(kāi)發(fā)者提供了一種在程序正式運(yùn)行前初始化包級(jí)變量的機(jī)制,然而,由于init函數(shù)的特殊性,不當(dāng)?shù)厥褂盟赡芤鹨幌盗袉?wèn)題,本文將深入探討如何有效地使用init函數(shù),列舉常見(jiàn)誤用并提供相應(yīng)的避免策略2024-01-01

