Go : 数组

2,501 阅读3分钟

数组的定义方式:

1、

var nums [3]int  	// 数组内容为{ 0, 0, 0}

这样的定义方式指定了 数组长度,默认数字类型初始值为0,字符类型为"" 其他类型为nil

2、

var nums = [...]int{1,2,3}  // 数组内容为 {1, 2, 3}

如果在数组长度的位置出现的时[...]则说明数组长度不确定。

这中定义方式在定义时即指定了数组的初始值,数组的长度为初始值元素的个数

3、

var nums = [...]int{1:3, 4:3} //数组内容为{0, 3, 0, 0, 3}

这个定义方式按照索引给定初始值,其余未给定初始值的元素默认为 (0, nil, "") 数组长度为索引的最大值+1

4、

nums := make([]int,4) // 数组长度为4 内容为{0,0,0,0}

严格的说,这个方式创建的其实不是数组,而是一个len为4,cap为4的切片。但从宏观的角度来看,切片又是个动态的数组,在这个定义方式下这个切片的长度固定,也可以视为一个长度暂时为4,元素暂时全为0的数组。

数组的使用方式

遍历

遍历有两种方式 :

1、传统的循环数组下标遍历数组:

for i:= 0; i<len(array);i++{
	// 处理 array[i]
}

2、迭代的方式遍历数组:

for key,value := range array{
	// key =i数组下标 ,value = 数组元素
}

go 语言的range() 函数类似于python 中的 enumerate()函数。 以k-v的形式返回两个值,一个是下标,一个是值。如果range的接收变量只有一个,默认只接收下标。如果没有接收变量,也无所谓。所以方式1也可以这么用:

for i := range array{
// 处理 array[i]
}

引用

Go 语言的数组引用几乎和C一模一样,照着C来就可以。

但有一点不太一样 C 中的 array[] 是一个隐式的指向数组的指针,但Go里不能直接这么用。

数组在被当成参数传递时被是值传递。在需要传入时复制数组,将拷贝出的数组副本当作参数传入,这个副本和原来的数组内存地址不一样,传入的副本会在函数执行结束时当作临时变量与函数一起被释放。

如果函数本身需要直接对数组本身进行操作。则需要先定义一个指向数组的指针,将指针传入函数进行操作。

空数组

go 里是可以定义空数组。虽然应用较少,但这也是个比较骚的操作。空数组占用的内存空间是0。

定义方式

var d [0]int
var e = [0]int{}
var f = [...]int{}
var g = []int

数组的比较

如果数组内的元素类型是可以互相比较的,那相同长度的数组之间也可以互相比较。比较的是值。

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

参考书目

[1] The Go programming Language

[2] Go语言高级编程

[3] Go官方文档