Go中slice编码为JSON
考虑如下场景: 用户调用API获取文章列表, 服务端返回的格式是JSON
格式如下
{
"code": 0,
"data": [{"name": "article1"}]
}
正常情况下, 当文章列表为空时, data
字段的值应该是[]
而不是null
, 因为客户端可以假设返回值永远是一个array
在go中, 编码JSON使用的是encoding/json
, 如下
import (
"encoding/json"
"fmt"
)
type user struct{
Name string `json:"name"`
}
type resp struce {
Code int `json:"code"`
Data []*user `json:"data"`
}
func main(){
var users []*user
// some code here
// such as append(&users, user1) etc.
result := resp{1, users}
res, _ := json.Marshal(result)
fmt.Println(res)
}
上方代码中, 如果注释部分的逻辑没有执行(比如放在一个if里面, 或者更常见的, 这部分是数据库查询), 最终users
这个slice长度为0, 编码后可以看到结果是
{
"code": 0,
"users": null
}
这是因为, 在go中, 变量声明而没有赋值的话, 默认取该变量的零值. slice是一个引用类型, 而引用类型的零值是nil
, 因此在上面的代码中, JSON编码的结果就是null
如果需要编码结果是[]
, 则需要用make
为slice分配内存并创建一个底层数组
users := make([]user, 0)