Golang 中 omitempty的作用

作者:? 时间:2024-04-25 15:13:03 

前言

在尝试将结构体序列化为 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

全部序列化成功。

Golang 中 omitempty的作用

TestOmitEmptyWithDefaultValue

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

Golang 中 omitempty的作用

testOmitEmptyWithDefaultValueButFatherSet

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

Golang 中 omitempty的作用

testOmitEmptyWithNotDefaultValueButFatherSet

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

Golang 中 omitempty的作用

来源:https://juejin.cn/post/7115343247530164254

标签:Golang,omitempty,作用
0
投稿

猜你喜欢

  • Go语言反射获取类型属性和方法示例

    2024-05-05 09:32:42
  • Vue的v-if和v-show的区别图文介绍

    2024-04-30 10:41:40
  • pandas DataFrame的修改方法(值、列、索引)

    2021-10-17 11:35:10
  • python中的三种注释方法

    2023-05-27 07:47:01
  • Python GUI布局工具Tkinter入门之旅

    2021-11-08 14:38:23
  • 基于Python制作一个汇率换算程序

    2022-05-25 20:33:25
  • 在WordPress中创建自定义页面模板方法详解

    2023-05-17 09:33:49
  • 使用Python写一个量化股票提醒系统

    2022-04-19 14:35:42
  • 慎用 script 节点的 src 属性来传递参数

    2009-11-18 12:59:00
  • Flask框架利用Echarts实现绘制图形

    2023-01-08 11:52:42
  • 关于网站导航设计的探讨

    2008-02-28 13:20:00
  • 利用Python制作一个MOOC公开课下载器

    2022-03-13 19:46:17
  • python异步Web框架sanic的实现

    2021-01-17 01:37:57
  • Python常用知识点汇总

    2023-02-17 09:42:44
  • Go语言的反射机制详解

    2024-05-09 14:58:51
  • Js实现简单的小球运动特效

    2023-07-08 23:40:40
  • Golang pipe在不同场景下远程交互

    2024-05-09 09:45:58
  • SQL语句练习实例之五 WMS系统中的关于LIFO或FIFO的问题分析

    2011-11-03 16:59:59
  • 剑走偏锋:体验ebay的AIR

    2008-11-13 11:51:00
  • Python Queue模块详解

    2023-01-13 00:42:02
  • asp之家 网络编程 m.aspxhome.com