Golang中空的切片转化成 JSON 后变为 null 问题的解决方案

 更新时间:2023年09月24日 10:02:04   作者:路多辛  
在 Golang 中,经常需要将其他类型(例如 slice、map、struct 等类型)的数据转化为 JSON 格式,有时候转化的结果并不是预期中的,例如将一个空的切片转化为 JSON 时,会变成"null",所以本文将给大家介绍一下解决方法,需要的朋友可以参考下

问题

在 Golang 中,经常需要将其他类型(例如 slice、map、struct 等类型)的数据转化为 JSON 格式。有时候转化的结果并不是预期中的,例如将一个空的切片转化为 JSON 时,会变成"null",而并非预期的"[]"。示例代码如下:

package main
import (
	"encoding/json"
	"fmt"
)
func main() {
	var res []string
	b, err := json.Marshal(res)
	if err != nil {
		panic(err)
	}
	fmt.Println(string(b))
}

运行示例看下结果:

$ go run main.go
null

结果输出的值为 “null”,而并非预期中的 “[]”。

原因

上面示例代码中的 res 是通过 var 关键字来声明为字符串类型切片的,这样的切片称为零值切片,其值为 nil,无指向任何内存地址。其出现实标题中这种情况的切片就是零值切片,接下来介绍下零值切片和空切片。

在 Golang 中,切片是一个长度可变的数组,有三个属性:指针、长度和容量。"零值切片"和"空切片"是两种特殊的切片。

  1. 零值切片:当一个切片类型的变量被声明但没有被显式初始化时,它的值就是一个零值切片。零值切片不会被分配内存空间,长度和容量都是零,零值切片也可以说是 nil 切片。例如:
var s []string
fmt.Println(s == nil)  // 输出 "true"
  • 空切片:空切片的长度和容量也都是零,但是指向了一个真实的、虽然是空的,但已经分配了内存的数组。空切片可以通过 make 函数或者字面量语法来创建。例如:
s := make([]string, 0)
fmt.Println(s == nil)  // 输出 "false"
s := []string{}
fmt.Println(s == nil)  // 输出 "false"

在这两个例子中,s 都是空切片,长度和容量都是零,但是值不是 nil。

零值切片和空切片在大多数情况下是可以互换使用的,都可以用来表示一个空的集合。但是如果需要区分一个切片是否被显式初始化过,就需要注意它们的区别了。而 encoding/json 库对两者的处理方式就是不一样的,会将零值切片编码为“null”,而将空切片编码为 “[]”。这可能会在某些情况下引发问题,例如当接口对于数组的处理期望"[]"而非"null"时。

讲解到这里,相信大家已经知道本文题目的答案了,如果将空的切片转化为 JSON 格式后预期得到“[]”,就需要在声明切片时,使用 make 函数或者字面量语法来创建切片。看个简单的示例:

package main
import (
	"encoding/json"
	"fmt"
)
func main() {
	res := make([]string, 0)
	// 或者 res:= []string{}
	// 而非 var res []string
	b, err := json.Marshal(res)
	if err != nil {
		panic(err)
	}
	fmt.Println(string(b))
}

运行代码看下效果:

$ go run main.go
[]

可以看出,达到了预期的效果。

小结

本文讲解了零值切片(nil 切片)和空切片的定义和差异,如果想将空的切片转化为 JSON 格式后得到 “[]”而不是“null”,最好的方式是使用 make 函数或者字面量语法来创建切片。

以上就是Golang中空的切片转化成 JSON 后变为 null 的问题的解决方案的详细内容,更多关于GolangJSON变为 null的资料请关注脚本之家其它相关文章!

相关文章

  • gorm 结构体中 binding 和 msg 结构体标签示例详解

    gorm 结构体中 binding 和 msg 结构体标签示例详解

    文章介绍了Gin框架中binding和msg结构体标签的使用,包括基本用法、常用验证规则、自定义验证器、错误信息自定义、控制器使用示例、组合验证规则、跨字段验证和初始化验证器等,这些标签主要用于数据验证、自定义错误信息、参数绑定和表单验证
    2024-11-11
  • Go语言实现Fibonacci数列的方法

    Go语言实现Fibonacci数列的方法

    这篇文章主要介绍了Go语言实现Fibonacci数列的方法,实例分析了使用递归和不使用递归两种技巧,并对算法的效率进行了对比,需要的朋友可以参考下
    2015-02-02
  • GO语言基础入门第一个go程序解读

    GO语言基础入门第一个go程序解读

    这篇文章主要为大家介绍了GO语言基础入门的第一个go程序解读,下面来带大家进入Go语言世界helloworld的大门吧,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-11-11
  • golang实现一个简单的websocket聊天室功能

    golang实现一个简单的websocket聊天室功能

    这篇文章主要介绍了golang实现一个简单的websocket聊天室功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10
  • golang db事务的统一封装的实现

    golang db事务的统一封装的实现

    这篇文章主要介绍了golang db事务的统一封装的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • Go基础教程系列之数据类型详细说明

    Go基础教程系列之数据类型详细说明

    这篇文章主要介绍了Go基础教程系列之数据类型详细说明,需要的朋友可以参考下
    2022-04-04
  • Golang如何调用windows下的dll动态库中的函数

    Golang如何调用windows下的dll动态库中的函数

    这篇文章主要介绍了Golang如何调用windows下的dll动态库中的函数方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • GoLang中Json Tag用法实例总结

    GoLang中Json Tag用法实例总结

    这篇文章主要给大家介绍了关于GoLang中Json Tag用法的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-02-02
  • 阿里云go开发环境搭建过程

    阿里云go开发环境搭建过程

    这篇文章主要介绍了阿里云go开发环境搭建过程,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-02-02
  • Go语言中两个比较流行的缓存库使用示例

    Go语言中两个比较流行的缓存库使用示例

    缓存是计算机科学中的一个重要概念,设想某个组件需要访问外部资源,它向外部源请求资源,接收并使用资源,这些步骤都需要花费时间,下面这篇文章主要给大家介绍了关于Go语言中两个比较流行的缓存库使用的相关资料,需要的朋友可以参考下
    2024-04-04

最新评论