GO slice为“空”,但仍具有容量

问题描述 投票:0回答:1

[我仍将头缠在golang中的切片上。我有一个数组x := []*T,其切片为“空”,但仍具有容量,输出为[{}, {}, {}]。即使我在json响应中有,omitempty标签,我仍然看到空片。我无法检查它们是否为空,因为像我说的len(x)cap(x)仍然说有数据。但是该数据已被json标签清空为空。因为该数据为空。有什么建议可以解决这个问题吗?

go slice
1个回答
0
投票
在Golang,
当声明变量时没有初始化值时,其值将设置为该类型的零值。 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。

© www.soinside.com 2019 - 2024. All rights reserved.