数组和切片
数组就不细讲, 几乎每种语言都有。编译期间确定大小,而且类型相同。不初始化的话,编译器会把数组各个值置为0。
数组定义:
//方式一
var arr1 = [5]int{}
//方式二
var arr2 = [5]int{1,2,3,4,5}
//方式三
var arr3 = [5]int{3:10}
赋值的话还是通过循环赋值。
for i := 0; i < len(arr1); i++ {
arr1[i] = i * 10
}
遍历数组
for index, value := range arr1 {
fmt.Printf(“index: %d, value: %d\n”, index, value)
}
数组作为函数的参数:
go语言在传递数组时会对其进行拷贝,所以如果传递的是大数组的话会非常占内存,所以一般情况下很少直接传递一个数组,避免这种情况我们可以使用以下两种方式:
传递数组的指针
传递切片
指针数组和数组指针
指针数组:一个数组里面装的都是指针。 编译器初始化值全为
数组指针:指向数组的指针。
在go语言中数组默认是值传递的
切片
切片操作与数组类似,但是它的长度是不固定的,可以追加元素,如果达到当前切片容量的上限会再自动扩容。
定义:
//方法一
var s1 = []int{}
//方法二
var s2 = []int{1, 2, 3}
//方法三
var s3 = make([]int, 5)
//方法四
var s4 = make([]int, 5, 10)
var s4 = make([]int, 5, 10)
方法一声明了一个空切片,方法二声明了一个长度为3的切片,方法三声明了一个长度为5的空切片,方法四声明了一个长度为5容量为10的切片。可以看到切片的定义与数组类似,但是定义切片不需要为其指定长度。
切片与数组的关系
对于任何一个切片来说,其都有一个底层数组与之对应,我们可以将切片看作是一个窗口,透过这个窗口可以看到底层数组的一部分元素。

如上
声明b切片时,其长度比a切片长
声明c切片时,其长度比a切片短
声明d切片时,其长度被定义为0
结果如图所示。