考虑如下场景: 用户调用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)