如何在go中找到数组的大小

时间:2016-03-11 10:31:38

标签: arrays go

我尝试了len()函数,但它给出了声明的值。 size()函数会出错。

代码:

package main
var check [100]int
func main() {
    println(len(check))
}

这里的输出是100,我需要数组中的总项目(即0)。

1 个答案:

答案 0 :(得分:21)

Go中的数组是固定大小:在Go中创建数组后,您无法在以后更改其大小。这是因为数组的长度是数组类型的一部分(这意味着类型[2]int[3]int是2种不同的类型)。也就是说,某些数组类型的值的长度总是相同的,并且由它的类型决定。例如,[100]int类型的数组值的长度始终为100,(可以使用内置函数len()查询)。

Spec: Array Types:

  

长度是数组类型的一部分;它必须通过类型int的值来评估为非负constant。可以使用内置函数len来发现数组a的长度。

如果您正在寻找“已设置了多少元素?”的答案,则不会在Go中跟踪。您正在寻找的“数组中的总项目”也始终与数组长度相同:在Go中创建数组时,数组中的所有元素都将初始化为元素类型的zero-value(除非否则例如通过使用composite literal)指定。

例如在此行之后:

var arr [100]int

数组arr已经有100 int个,都是0(因为这是int类型的零值)。在以下行之后:

var arr2 = [3]int{1, 2, 3}

数组arr2有3个int个元素,分别是123。并在以下行之后

var arr3 = [...]bool{3: true}

数组arr3有4个bool元素,falsefalsefalsetruefalse是类型为bool的零值,我们仅将第4个元素指定为true,其位于索引3)。

如果您询问slices

,您的问题可能会有更多意义
  

切片是底层数组的连续段的描述符,并提供对该数组中编号的元素序列的访问。

所以基本上切片是数组中某些(连续)部分的“视图”。切片头或描述符包含指向它在数组中描述的部分的第一个值的指针,它包含长度和容量(可以扩展长度的最大值)。

我真的建议阅读以下博文:

The Go Blog: Go Slices: usage and internals

The Go Blog: Arrays, slices (and strings): The mechanics of 'append'