array
array 即数组类型,数组的长度是不可变的。不同长度或不同元素类型的数组是不同类型。即 [3]int 和 [4]int 是不同的类型,[3]int 和 [3]float32 是不同的类型
array 的声明和初始化
package main
import (
"fmt"
)
func main() {
var arr [10]int //声明了一个长度为 10 的数组, 元素默认初始值为 0
fmt.Println(arr) //[0 0 0 0 0 0 0 0 0 0]
//通过 := 来声明和初始化
cnt := [3]int{1, 2, 3} //声明了一个长度为 3 的数组并初始化
gel := [10]int{1, 2, 3} //声明了一个长度为 10 的数组, 且前 3 个元素初始化为 1, 2, 3, 其余元素默认初始化为 0
aaa := [...]int{1, 2, 3, 4, 5} //...能自动计算长度, 若没有加 ... 则是声明切片类型
bbb := [4]int{1 : 2} //指定下标为 1 的元素值为 2,其余元素默认初始化为 0
fmt.Println(cnt) //[1 2 3]
fmt.Println(gel) //[1 2 3 0 0 0 0 0 0 0]
fmt.Println(aaa) //[1 2 3 4 5]
fmt.Println(bbb) //[0 2 0 0]
//声明并初始化二维数组
a := [2][3]int{[3]int{1, 2, 3}, [3]int{}}
b := [2][3]int{ {1, 2, 3}, {}} //简化声明
fmt.Println(a) //[[1 2 3] [0 0 0]]
fmt.Println(b) //[[1 2 3] [0 0 0]]
c := [4]int{1, 2, 3, 4}
fmt.Println(sum(c)) //10
fmt.Println(c) //[1 2 3 4], c 数组的值没有被改变, 是值传参
d := []int{1, 2, 3} //这里的 d 是一个切片类型, 引用传参
yxl(d) //引用传参
fmt.Println(d) //[-1 2 3]
ptr(&d)
fmt.Println(d) //[-1 2 3]
}
func ptr(arr *[]int) { //指针数组参数
(*arr)[0] = -1 //先解引用在用下标访问
}
func yxl(arr []int) { //若传的实参是推到长度的数组(***实际上这是一个切片类型***), 则形参数组可以不用指定长度
arr[0] = -1
}
func sum(arr [4]int) int {
sum := 0
for i, x := range arr {
sum += x
arr[i] = -1
}
return sum
}
注意
既没有长度又没有加 … 声明的是切片类型,是一种类似于数组但是长度可变的引用类型
array 是值类型,进行赋值或者传参操作是值类型的操作
若传的实参是推到长度的数组, 则形参数组可以不用指定长度(使用切片)。若实参是指定长度声明的,则形参同样需要指定长度
指针数组不能直接用下标访问元素,需要先用 * 解引用,才可以用下标访问元素