go数组是一个由固定长度的特定类型元素组成的序列,元素个数可以是多个或者0个。0个就是空数组,空数组不占用内存(用的场景如通道的同步操作,避免分配额外的内存)。长度不同或者元素类型不同的数组都是不同的类型,长度是数组类型的一部分。数组用法如下例子:
package main
import "fmt"
func main() {
var a [3]int
var b = [...]int{1, 2, 3}
var c = [...]int{1:2, 2:3}
var d = [...]int{1, 2, 4:5, 5:6}
fmt.Printf("a = %#v\n", a) //a = [3]int{0, 0, 0}
fmt.Printf("b = %#v\n", b) //b = [3]int{1, 2, 3}
fmt.Printf("c = %#v\n", c) //c = [3]int{0, 2, 3}
fmt.Printf("d = %#v\n", d) //d = [6]int{1, 2, 0, 0, 5, 6}
var copyA = a
copyA[0] = 8
fmt.Printf("a = %#v\n", a)//a = [3]int{0, 0, 0}
var copyB = &b
copyB[0] = 9
fmt.Printf("b = %#v\n", b)//b = [3]int{9, 2, 3}
for i, v := range copyB {
fmt.Println(i, v)
//0 9
//1 2
//2 3
}
for i := range copyB {
fmt.Println(i)
//0
//1
//2
}
fmt.Println(cap(copyB)) //3
var times [3][0]int
for i := range times {
println(i, "times")
//0 times
//1 times
//2 times
}
}
上面示例解析:
1. GO语言中数组是值语义,一个数组变量即表示整个数组,它并不是隐式地指向第一个元素的指针,而是一个完整的值。数组赋值会复制整个数据,是值传递。
2.上例中copyB是一个数组指针(指向数组的指针),注意它是个指针而不是数组,但是除了它的类型跟数组不一样外,它的用法跟数组变量一模一样,包括range用法。
3. range只赋值给一个元素时,赋值的是索引的值。
4. 可以把数组当作是一个结构体使用,索引就标识结构体中的字段名。
5. times占用内存为0,不用付出额外的内存代价,就能实现times次迭代
数组不仅可以定义数值数组,还能定义字符串数组、结构体数组、函数数组、接口数组、通道数组等。