切片声明和初始化之间的区别

difference between slice declaration and initialization

a和b有什么区别?我知道 reflect.DeepEqual 认为它们不相等并且我知道 a 为零。是否有内置函数可以轻松显示差异?

var a []foo
b := []foo{}

azero value 使其为零。

nil for pointers, functions, interfaces, slices, channels, and maps.

b 相反,它被初始化为 short declaration

fmt.Println(a == nil, b == nil)

打印 true false(游乐场:http://play.golang.org/p/E0nQP8dVyE)。 a 是一个 nil 切片,而 b 只是一个空切片。在实践中没有太大区别,但通常,在一个查询数据库的函数中,一个 nil 切片意味着没有结果(由于错误或其他原因),而一个空切片 - 它找不到信息.

有关较低级别的差异,请参阅 Russ Cox 的 Go Data Structures 文章。