如果你有过其他编程语言基础的话,那么数组对你来讲绝对不会陌生,它是编程领域中最最常见的数据结构之一。
顾名思义,数组就是指一系列同一类型数据的集合。数组中的每一个元素我们称之为数组元素(element),一个数组包含的元素个数成为数组长度(length)。数组长度可以是0个或多于0个,但是一旦确定下来,这个长度就是固定不变的。数组长度是数组类型的一个组成部分。是在编译阶段就确定下来的,所以可以是常量或常量表达式。因此,在实际应用中,很少用到数组(更多的是切片)。
在Go语言中,数组是一个值类型(value type),而不是指向数组内存起始位置的指针。 值类型在赋值和作为参数传递时都将产生一次复制动作。对数组参数的任何的修改都是发生在复制的数组上,并不能直接修改调用时原始的数组变量。这一点跟C语言中的处理方式大不相同。当然,也可以显示地传入一个数组指针(*[n]T)来达成期望的效果。但依旧不建议使用数组来实现这种场景。
下面的代码示例中展示了数组的声明、获取数组元素以及长度、循环遍历数组等常见操作。
var a [3]int // array of 3 integers
fmt.Println(a[0]) // print the first element
fmt.Println(a[len(a)-1]) // print the last element, a[2]
// Print the indices and elements.
for i, v := range a {
fmt.Printf("%d %d\n", i, v)
}
// Print the elements only.
for _, v := range a {
fmt.Printf("%d\n", v)
}
// For 循环
for i := 0; i < len(c); i++ {
fmt.Printf("c[%d]: %d\n", i, c[i])
}
遍历方法中,用for range方式的性能可能会更好一些,因为这种迭代可以保证不会出现数组越界的情形,每轮迭代对数组元素的访问时可以省去对下标越界的判断。
如果下标在数组合法范围之外(0~len(s)-1),则触发访问越界的panic。
# command-line-arguments
.\main.go:27:16: invalid array index 3 (out of bounds for 2-element array)
数组默认情况下会被初始化为元素类型对应的零值。也可以使用数组字面值语法来初始化数组:
var q [3]int = [3]int{1, 2, 3}
var r [3]int = [3]int{1, 2}
fmt.Println(r[2]) // "0"
q := [...]int{1, 2, 3}
fmt.Printf("%T\n", q) // "[3]int"
r := [...]int{99: -1} //长度100,最后一个元素-1
如果在数组的长度位置出现的是“...”省略号,则表示数组的长度是根据初始化值的个数来计算。
数组可以用 “==” 或 “!=” 进行判等操作,且只有两个数组中的每一个元素都相等时,结果才为true。
a := [2]int{1, 2}
b := [...]int{1, 2}
c := [2]int{1, 3}
fmt.Println(a == b, a == c, b == c) // "true false false"
d := [3]int{1, 2}
fmt.Println(a == d) // compile error: cannot compare [2]int == [3]int
以上就是数组的全部内容,你学的怎么样?