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 是值类型,进行赋值或者传参操作是值类型的操作
若传的实参是推到长度的数组, 则形参数组可以不用指定长度(使用切片)。若实参是指定长度声明的,则形参同样需要指定长度
指针数组不能直接用下标访问元素,需要先用 * 解引用,才可以用下标访问元素