为什么这两个值json.Marshal之后一个为null一个为[ ]?

clipboard.png

打印出来的类型和值都是一样的,如下:

clipboard.png

但为什么结果不同?

clipboard.png

补充一下: list获取的函数如下:

clipboard.png

阅读 4.9k
3 个回答
    var x []string
    fmt.Println(x, reflect.TypeOf(x), len(x), cap(x), x == nil)
    x1 := []string{}
    fmt.Println(x1, reflect.TypeOf(x1), len(x1), cap(x1), x1 == nil)

    b1, _ := json.Marshal(x)
    fmt.Println("x: ", string(b1))
    b2, _ := json.Marshal(x1)
    fmt.Println("x1: ", string(b2))

输出:

[] []string 0 0 true
[] []string 0 0 false
x:  null
x1:  []

两种不同的初始化方式引起的额,由此可知函数返回值和var方式都是“声明”,而不是“定义”。

第一段代码里面的 list 跟最后一段代码 toList() 方法之间的关系不明确,不太好回答。

从结果看:

//json encode 之后成了 null ,说明原值是 null
data["actions"] = list

x := []string{}
//等效于
var x = make([]string, 1)
x[0] = ""
//所以下列代码中 actionss json encode 之后是 []
data["actionss"] = []string{}

//只进行了声明,而没有初始化
var list []string
//进行声明并初始化
list := []string{}
//等同于
list := make([]string, 0)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进