← Backend / Go / 基础专题

11_数组与值复制

声明定长数组,理解长度属于类型、赋值会复制元素。

Go 基础专题 11:数组与值复制

学习目标:声明定长数组,理解长度属于类型、赋值会复制元素。

核心知识

数组 [N]T 含固定数量的 T 值,长度 N 是类型的一部分。[3]int{1,2,3} 与 [4]int{1,2,3,4} 类型不同。省略长度可写 [...]int{1,2,3} 让编译器计数。数组默认值按元素类型零值初始化。

package main

import "fmt"

func main() {
    original := [3]int{1, 2, 3}
    copied := original
    copied[0] = 9
    fmt.Println(original, copied) // [1 2 3] [9 2 3]
}

数组赋值和传参会复制整个数组,适合长度固定且较小的数据。大多数动态集合用切片 []T;切片赋值不会复制底层元素,行为与数组不同。用 len(array) 得到长度,索引范围为 0 到 len-1,越界会 panic。

元素类型可比较时,数组可以用 == 比较每个对应元素。数组若包含切片或映射等不可比较字段,就不能整体比较。二维数组如 [2][3]int 可以表示固定矩阵,但动态表格通常用切片的切片。

逐步理解

观察复制示例:copied := original 复制三个整数,修改副本不会影响原数组。若元素是指针,复制的是指针值,指向的对象仍可能共享;“数组值复制”不自动等于对象图深复制。把 [3]int 作为函数参数也会发生数组值复制,这与切片参数的行为不同。

动手练习

练习:创建长度 3 的字符串数组,修改副本第一个元素,验证原数组不变。答案要点:先 copy := original,再打印两者。