我在 golang 中使用反射来制作一个新的初始化切片。但是当我 json.Marshal 这个新的反射切片时,我得到一个 JSONnull
值而不是一个[]
. 在此处查看此示例,其中我比较了两种情况:
package main
import (
"encoding/json"
"reflect"
"log"
)
func makeslice(slice interface{}) interface{} {
return reflect.New(reflect.TypeOf(slice)).Elem().Interface()
}
func main() {
s0 := []int{2,3,5}
s1 := makeslice(s0).([]int)
js1,e1 := json.Marshal(s1)
log.Println("case 1:",reflect.TypeOf(s1),reflect.ValueOf(s1),e1,string(js1))
s2 := []int{}
js2,e2 := json.Marshal(s2)
log.Println("case 2:",reflect.TypeOf(s2),reflect.ValueOf(s2),e2,string(js2))
}
这给出了以下输出:
case 1: []int [] <nil> null
case 2: []int [] <nil> []
请注意,case 1
并case 2
产生完全相同的日志输出,除了最终的 json 字符串,第一种情况显示null
,第二种情况显示[]
。
为什么会这样?我想要case 1
显示的是[]
因为我朋友的客户端应用程序总是需要一个数组,并且零长度数组不应该显示为空。
我究竟做错了什么?