Go语言中数组直接赋值与[:]切片语法的行为差异疑问
Go 数组与切片的赋值行为差异
核心结论
你的理解完全准确,两种操作的行为差异本质是Go语言中数组、切片的底层类型特性决定的:
- 执行
b := a(数组直接赋值)时,会完整拷贝原数组的所有元素,生成两个完全独立的内存实例,修改任意一方的元素都不会影响另一方,这也是Go数组作为值类型的典型特征。 - 执行
b := a[:](从数组派生切片)时,生成的切片并不会拷贝原数组的元素,只是创建了一个切片头部结构体,内部存储的指针直接指向原数组a的内存地址,二者共享同一块底层存储,所以任意一方修改元素,另一方读取到的值都会同步变化。
额外注意:当你对上述派生的切片执行
append操作、且超出原切片的容量限制时,Go会为切片分配一块全新的底层数组并拷贝当前元素,这时候切片就会和原数组解除关联,后续的修改操作将不再互相影响。
内容的提问来源于stack exchange,提问作者Ketu
相关产品推荐
相关产品推荐

