Golang 中 omitempty的作用

 更新时间:2022年07月15日 09:15:59   作者:​ 凡森Zfans  ​  
这篇文章主要介绍了Golang 中 omitempty的作用,文章围绕主题展开详细的内容介绍,具有一定的参考一下,需要的小伙伴可以参考一下

前言

在尝试将结构体序列化为 Json 时,你可能会遇到 “omitempty” 标记,本小记就来浅看一下它如何起作用。

先上结论:

  • 基本类型的默认值会被 omit,除了数组。
  • 指针类型为 nil 时会被 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

默认值全军覆没,除了数组。

testOmitEmptyWithDefaultValueButFatherSet

自己设置的默认值也全军覆没,除了数组。

testOmitEmptyWithNotDefaultValueButFatherSet

非默认值当然不会被省略了。

到此这篇关于Golang 中 omitempty的作用的文章就介绍到这了,更多相关Golang omitempty内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一文让你理解go语言的Context

    一文让你理解go语言的Context

    在Go语言中,Context(上下文)是一个类型,用于在程序中传递请求范围的值、截止时间、取消信号和其他与请求相关的上下文信息,它在多个goroutine之间传递这些值,使得并发编程更加可靠和简单,本文详细介绍go语言的Context,需要的朋友可以参考下
    2023-05-05
  • Go实现自己的网络流量解析和行为检测引擎原理

    Go实现自己的网络流量解析和行为检测引擎原理

    这篇文章主要为大家介绍了Go实现自己的网络流量解析和行为检测引擎原理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • golang日志包logger的用法详解

    golang日志包logger的用法详解

    这篇文章主要介绍了golang日志包logger的用法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • Golang开发之接口的具体使用详解

    Golang开发之接口的具体使用详解

    在 Golang 中,接口是一种类型,它是由一组方法签名组成的抽象集合。这篇文章主要为大家介绍了Golang接口的具体使用,希望对大家有所帮助
    2023-04-04
  • Go 语言中静态类型和动态类型的使用

    Go 语言中静态类型和动态类型的使用

    本文主要介绍了Go语言中的静态类型和动态类型,静态类型在编译时确定,提供了类型安全,性能优化和代码清晰,而动态类型在运行时确定,提供了更高的灵活性,但可能引发运行时错误,下面就来介绍一下,感兴趣的可以了解一下
    2024-10-10
  • Go中RPC远程过程调用的实现

    Go中RPC远程过程调用的实现

    本文主要介绍了Go中RPC远程过程调用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • golang MySQL实现对数据库表存储获取操作示例

    golang MySQL实现对数据库表存储获取操作示例

    这篇文章主要为大家介绍了golang MySQL实现对数据库表存储获取操作示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • 详解golang开发中select多路选择

    详解golang开发中select多路选择

    这篇文章主要介绍了golang开发中select多路选择,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • golang跳转语句goto,break,continue的使用及区别说明

    golang跳转语句goto,break,continue的使用及区别说明

    这篇文章主要介绍了golang跳转语句goto,break,continue的使用及区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Golang中的自定义类型之间的转换的实现(type conversion)

    Golang中的自定义类型之间的转换的实现(type conversion)

    这篇文章主要介绍了Golang中的自定义类型之间的转换的实现(type conversion),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02

最新评论