Go 数组

数组是长度固定的同类元素序列,长度在声明时定死。声明格式:var 变量名 [长度]类型。(说明:文中的片段代码需放进完整程序里运行)

声明与初始化

完整示例:

package main

import "fmt"

func main() {
	var a [3]int              // 只声明,元素默认零值 0
	b := [3]int{1, 2, 3}      // 按顺序初始化
	c := [...]int{4, 5, 6, 7} // ... 让编译器数长度
	d := [5]int{1: 10, 3: 30} // 按下标赋值,其余为 0
	fmt.Println(a, b, c, len(c), d)
}
// 输出: [0 0 0] [1 2 3] [4 5 6 7] 4 [0 10 0 30 0]

len() 返回长度;[...] 必须配合初始化值,由编译器推断长度。

访问与遍历

下标从 0 开始。经典 for 与 for range 都可以遍历:

nums := [5]int{2, 4, 6, 8, 10}
nums[0] = 1 // 按下标修改

for i := 0; i < len(nums); i++ { // 经典 for
	fmt.Print(nums[i], " ")
}
fmt.Println()
for i, v := range nums { // range:同时给下标和值
	fmt.Printf("nums[%d]=%d\n", i, v)
}
// 输出:
// 1 4 6 8 10
// nums[0]=1(随后逐行 nums[1]=4,直到 nums[4]=10)

不需要下标时写成 for _, v := range nums,用 _ 忽略。

多维数组

数组的元素还可以是数组。matrix[2][3] 表示 2 行 3 列:

var m [2][3]int // 默认全 0
for i := 0; i < 2; i++ {
	for j := 0; j < 3; j++ {
		m[i][j] = i + j // 先取第 i 行,再取第 j 列
	}
}
fmt.Println(m)    // [[0 1 2] [1 2 3]]
fmt.Println(m[1]) // 单独取第二行:[1 2 3]

把数组传给函数:整块复制

数组作为参数是值传递:函数拿到完整副本,修改不影响原数组:

func setZero(arr [3]int) { arr[0] = 0 } // 改的是副本

// n := [3]int{1,2,3}; setZero(n) → n 仍是 [1 2 3]

想直接改原数组需要传指针 *[3]int,但日常更推荐用切片(见下篇《Go 切片》)。

小结:数组长度固定、传参按值拷贝;实际开发更常用动态的切片,但数组是理解切片底层的基础。

笔记加载中…