Golang | 数组的定义和使用
数组
同一种类型的集合称之为数组,数组是一组已编号且长度固定的数据项序列,数组中可以是任意的相同类型,数组的长度必须是一个常量或常量表达式,数组的索引是从0开始,到len(Array) - 1 的长度,数组的长度必须在声明时就固定下来。在Go语言中,类型控制的是非常严格的,比如:[2]int 和 [3]int 就是两种不同的类型。
使用
func main() {
// 先声明,然后再赋值
a := [2]int{}
a[0] = 1
a[1] = 2
// 声明的时候初始化
b := [2]int{3, 4}
// 以元素的个数初始化
c := [...]int{5, 6, 7, 8}
// 以下标初始化
d := [4]int{1: 9, 3: 10}
// 以 new 初始化, 返回数组的指针
e := new([5]int)
fmt.Println(a)
fmt.Println(b)
fmt.Println(c)
fmt.Println(d)
fmt.Println(e)
// 输出
// [1 2]
// [3 4]
// [5 6 7 8]
// [0 9 0 10]
// &[0 0 0 0 0]
}
二维数组
func main() {
arr := [2][3]int{{12,13,14},{15,16,17}}
fmt.Println(arr)
// 输出:
// [[12 13 14] [15 16 17]]
}
数组在函数间的传递
能通过第一次的打印看出来,初始化出来的数组都是值类型的,那么数组在函数间的传递也是值类型的吗?
func arrPrint(arr [4]int) {
arr[2] = 100
fmt.Println("arrPrint:",arr)
}
func main() {
arr := [4]int{1,2,3,4}
arrPrint(arr)
fmt.Println("main:",arr)
// 输出:
// arrPrint: [1 2 100 4]
// main: [1 2 3 4]
}
能过上面的例子,可以发现,上现函数中修改了数组中的值,但是 main 函数中的打印并没有改变,所以可以确定,数组在函数间传递的时候就是值传递。
这样又会造成一个问题,因为值传递是数组间的复制,如果一个数组小的时候,对性能影响不会很大,但是当一个数组非常大的时候,对程序的性能就会造成很大的影响了,所以为了解决这个问题,在使用数组进行传值的时候一般都会使用地址传递,在函数中使用指针类型的数组进行接收。
在实际开发的时候,因为数组的扩展性不好,所以一般不使用数组,基本上使用的都是切片
数组因为是值类型,所以,在类型完全相同的情况下支持使用
==
!=
比较
关注公众号,随时获取最新资讯
细节决定成败!
个人愚见,如有不对,恳请斧正!