我的代码调用的库函数大致如下:
func Search() ([]myLibrary.SomeObject, error) {
var results []apiv17.SomeObject
// ...
if (resultsFound) {
results = append(results, someResult)
}
return results
}
...我的代码调用它,然后将其封送到JSON.
results, err := myLibrary.Search()
bytes, err := json.Marshal(results)
现在的问题是,由于Search
函数的编写方式(假设我们无法更改它),如果没有结果,它将返回未初始化的nil
切片.不幸的是,无法将encoding/json
配置为将nil切片编码为[]
(例如,请参阅正在进行讨论的这proposal).
明确判断nil
可以解决问题:
results, err := myLibrary.Search()
if results == nil {
results = []apiv17.SomeObject{}
}
bytes, err := json.Marshal(results)
...但它还添加了对返回类型apiv17.SomeObject
的显式依赖.这很不方便,因为这种类型在库中经常变化.E、 g.在下一个库版本中,它可能是apiv18.SomeObject
.
有了上面的nil
判断,每次发生这种情况时,我都必须更新代码.
有没有办法避免这种情况,在不显式引用其类型的情况下为变量分配一个空的非零切片?类似这样:
results = [](type of results){}