知识卡片
数组是值
内容
Go 数组包含固定长度和元素类型,赋值或传参会复制整个数组。它的值语义让别名关系更简单,但大数组复制成本高;需要共享和变长时应转向切片。
参考来源
- 位置:《Go语言底层原理剖析》第6章《数组》6.2节《数组值复制》
- 结论依据:原文明确"与C语言中的数组显著不同的是,Go语言中的数组在赋值和函数调用时的形参都是值复制",并用打印赋值前后数组地址的实验证明"每个数组在内存中的位置都是不相同的,验证了值复制",因此可以推出"数组赋值/传参会复制整个数组,与其他语言值语义不同"的结论。
- 原始内容:与C语言中的数组显著不同的是,Go语言中的数组在赋值和函数调用时的形参都是值复制。如下所示,无论是赋值的b还是函数调用中的c,都是值复制的。这意味着不管是修改b还是c的值,都不会影响a的值,因为他们是完全不同的数组。可以使用下例中的程序打印出赋值前后的地址来验证值复制。程序输出如下,每个数组在内存中的位置都是不相同的,验证了值复制。