[我仍将头缠在golang中的切片上。我有一个数组x := []*T
,其切片为“空”,但仍具有容量,输出为[{}, {}, {}]
。即使我在json响应中有,omitempty
标签,我仍然看到空片。我无法检查它们是否为空,因为像我说的len(x)
和cap(x)
仍然说有数据。但是该数据已被json标签清空为空。因为该数据为空。有什么建议可以解决这个问题吗?
当声明变量时没有初始化值时,其值将设置为该类型的零值。 Slice的零值为nil,因此在上面的示例中,当我们声明var foo []string
时,foo的值实际上为nil,而不是string []
的空切片。空切片可以通过使用短变量声明来生成。foo := []string{}
或make
功能。为什么这很重要?
var nilSlice []string emptySlice := make([]string, 5) fmt.Println(nilSlice) // Output: [] fmt.Println(len(nilSlice), cap(nilSlice)) // Output: 0 0 fmt.Println(nilSlice == nil) // Output: true fmt.Println(emptySlice) // Output: [] fmt.Println(len(emptySlice), cap(emptySlice)) // Output: 0 0 fmt.Println(emptySlice == nil) // Output: false
以上示例演示了Nil Slice如何欺骗我们的眼睛。
fmt.Println-零切片的结果是[],就像我们对空切片所拥有的一样。它的长度和容量也与“空片”相同。大多数时候,我们不需要区别对待这两个。即使其初始值为nil,我们仍然可以追加和迭代Nil Slice。