
Go 语言中,数组赋值(如 a[0] = a[1])执行的是深拷贝——被拷贝的元素值被完整复制到目标数组中,两者在内存中完全独立,互不影响。
go 语言中,数组赋值(如 `a[0] = a[1]`)执行的是**深拷贝**——被拷贝的元素值被完整复制到目标数组中,两者在内存中完全独立,互不影响。
在 Go 中,数组是值类型,其底层不包含隐式指针(除非数组元素本身是指针类型,如 [3]*int)。这意味着每次对数组变量的赋值、函数传参或返回,都会触发整个数组内容的逐字节复制。
以你的示例为例:
var a [2][3]int a[0][0] = 55; a[0][1] = 56; a[0][2] = 57 a[1][0] = 65; a[1][1] = 66; a[1][2] = 67
此时 a 在内存中是一块连续的 6 个 int 的存储区域(假设 int 为 8 字节,则共 48 字节),布局如下:
[55 56 57 | 65 66 67] ↑ ↑ a[0] a[1]
执行 a[0] = a[1] 后,Go 将 a[1] 的三个 int 值(65, 66, 67)逐个复制到 a[0] 对应的内存位置,结果变为:
[65 66 67 | 65 66 67] ↑ ↑ a[0] a[1]
✅ 此时 a[0] 和 a[1] 拥有各自独立的内存副本:修改 a[0][0] 不会影响 a[1][0],反之亦然。
⚠️ 注意事项:
- 这一行为仅适用于数组(array);切片(slice)截然不同——切片是引用类型,包含指向底层数组的指针、长度和容量,赋值仅为浅拷贝(共享底层数组)。
- 数组大小是类型的一部分(如
[2][3]int与[3][2]int类型不同),因此拷贝严格按类型尺寸进行,编译器可静态验证安全性。 - 大数组(如
[1000000]int)频繁赋值可能带来性能开销,此时应考虑改用切片或指针传递。
总结:Go 的数组拷贝本质是内存块的完整复制,是地道的深拷贝。理解这一点,是写出内存安全、行为可预测的 Go 代码的关键基础。

















