01
概念
数组是具有固定长度,并且有零个或多个相同数据类型元素的序列,数组长度是数组类型的一部分,也就是说 [3]int 和 [4]int 是两个不同类型的数组,二者不可以比较,数组通过索引访问元素,Go 语言内置函数 len 可以返回数组的长度,在 Go 语言中,数组是值传递。
02
声明数组和初始化
在 Go 语言中,声明数组需要显式指定数组名称、数组长度和数组类型,默认情况下,未显示初始化一个新声明数组中的元素,数组初始值为元素类型的零值。在声明数组时,可以显式初始化数组的元素,并且可以指定索引位置和定义索引位置别名。其中,指定索引位置初始化数组元素,数组的长度为最大的索引位置数值加 1。通过代码,我们演示声明一个新数组的几种方式。
- 声明数组,未初始化
func main() { var arr [3]int fmt.Println("arr 数组的第一个元素是:", arr[0]) fmt.Println("arr:", arr) }
- 初始化数组元素
var arr2 = [4]int{1, 2, 3, 4} fmt.Println("arr2:", arr2)
- 初始化数组元素,数组长度使用省略号
var arr3 = [...]int{1, 2, 3, 4, 5} fmt.Println("arr3 的长度:", len(arr3))
- 初始化数组元素,数组长度使用省略号,数组的长度由初始化数组的元素个数决定。
- 定义索引位置别名初始化数组元素
const ( name int = iota email ) var arr4 = [...]string{name: "lucy", email: "lucy@gmail.com"} fmt.Println(name, arr4[name]) fmt.Println("arr4:", arr4[0])
- 指定索引位置初始化数组元素
var arr5 = [...]int{99: 100} fmt.Println(arr5[0], arr5[1], arr5[99])
- 初始化数组元素,指定索引位置,数组的长度为最大索引数值加 1。
- 声明多维数组
var arr6 = [5]int{1, 2, 3, 4, 5} var arr7 = [...]int{1, 2, 3, 4, 5} var arr8 = [5]int{2, 3, 4, 5, 6} if arr6 == arr7 { fmt.Println("arr6 与 arr7 相等") } else if arr6 == arr8 { fmt.Println("arr6 与 arr8 相等") }
声明多维数组,仅第一维度允许使用省略号。
03
数组比较
在 Go 语言中,数组支持比较,需要注意的是,数组的长度是数组类型的一部分,也就是说 [3]int 和 [4]int 是两个不同的数据类型,不可以比较。在数组类型一致的前提下,数组之间才可以比较,并且只有数组的所有元素值全部相等,数组才相等。通过代码,我们演示数组比较的用法。
var arr6 = [5]int{1, 2, 3, 4, 5} var arr7 = [...]int{1, 2, 3, 4, 5} var arr8 = [5]int{2, 3, 4, 5, 6} if arr6 == arr7 { fmt.Println("arr6 与 arr7 相等") } else if arr6 == arr8 { fmt.Println("arr6 与 arr8 相等") }
04
数组遍历
在 Go 语言中,除了使用 for 语句通过循环访问数组的索引,遍历数组元素之外,还可以使用 for...range 遍历数组,并且可以使用 “_” 忽略数组的索引。通过代码,我们演示使用 for...range 遍历数组。
var arr6 = [5]int{1, 2, 3, 4, 5} for index, value := range arr6 { fmt.Printf("arr6[%d]=%d\n", index, value) } for _, value := range arr6 { fmt.Println("arr6=", value) }
05
指针数组和数组指针
在 Go 语言中,指针数组是指数组的元素为指针类型的值,数组指针是指数组的内存地址。数组指针可以直接用来操作元素。通过代码,我们演示指针数组和数组指针的用法。
x, y := 1, 2 a := [2]*int{&x, &y} p := &a fmt.Println("数组的元素为指针类型的指针数组:", a) fmt.Println("存储数组的内存地址的数组指针:", p)
06
数组是值传递
在 Go 语言中,数组是值传递,赋值和传参都会创建一个数组的副本,声明一个新数组,使用原数组赋值给新数组,修改原数组,新数组的元素值不改变,通过代码,我们演示数组是值传递。
var arr9 = [3]int{1, 2, 3} var arr10 [3]int arr10 = arr9 fmt.Println("arr9:", arr9) fmt.Println("arr10:", arr10) arr9[0] = 10 fmt.Println("arr9:", arr9) fmt.Println("arr10:", arr10)
完整代码:
输出结果:
arr 数组的第一个元素是:0 arr: [0 0 0] arr2: [1 2 3 4] arr3 的长度:5 0 lucy arr4: lucy 0 0 100 二维数组 arrS: [[1 2 3] [10 20 30]] arrS2: [[[1 2 3] [4 5 6]] [[11 12 13] [14 15 16]]] arr6 与 arr7 相等 arr6[0]=1 arr6[1]=2 arr6[2]=3 arr6[3]=4 arr6[4]=5 arr6= 1 arr6= 2 arr6= 3 arr6= 4 arr6= 5 数组的元素为指针类型的指针数组:[0xc0000b4080 0xc0000b4088] 存储数组的内存地址的数组指针:&[0xc0000b4080 0xc0000b4088] arr9: [1 2 3] arr10: [1 2 3] arr9: [10 2 3] arr10: [1 2 3]