
在 go 中使用切片模拟二维数组时,若重复复用同一底层数组的切片变量并 append 到外层切片,会导致所有子切片指向相同内存地址,从而出现数据覆盖和重复现象。
在 go 中使用切片模拟二维数组时,若重复复用同一底层数组的切片变量并 append 到外层切片,会导致所有子切片指向相同内存地址,从而出现数据覆盖和重复现象。
Go 的切片(slice)是引用类型,包含指向底层数组的指针、长度和容量。当你声明 row := make([]int, n) 后,在循环外仅创建一次,后续每次 fmt.Scanf 都是在修改同一块底层内存;而 append(array, row) 并非复制数据,只是将该切片头(含指针)追加进 array。因此,array 中所有元素最终都指向最后一次迭代写入的 row 内容——这就是为何输出中两个子切片都显示 [3 4]。
✅ 正确做法是在每次外层循环中新建独立切片,确保每个 row 拥有独立的底层数组:
func main() {
var n int
fmt.Scanf("%d", &n)
array := [][]int{}
for i := 0; i <p>⚠️ 注意事项:</p>
- 不要复用已存在的切片变量作为多维结构的“行容器”;
- 若需预分配容量或优化性能,可考虑 make([][]int, n) + make([]int, n) 组合,但核心原则不变:每行必须拥有独立底层数组;
- 可通过 fmt.Printf("%p", &row[0]) 打印首元素地址验证是否为不同内存块。
掌握切片的引用语义是避免此类 bug 的关键——append 操作的是切片头信息,而非深拷贝数据。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











