Go语言中为什么array的值可以被另一个变量修改?
问题核心原因:你混淆了Go中的数组(array)和切片(slice)
你示例代码中声明的arr := []int{0,0,0}不是数组类型,是切片类型,这是运行结果和预期不符的根本原因。
两者的核心区别如下:
- 数组是值类型,声明时必须指定固定长度,比如
[3]int才是长度为3的int数组。数组赋值时会完整拷贝所有元素,修改其中一个数组实例完全不会影响另一个,符合你对值类型的认知。 - 切片是带引用语义的结构体类型,声明时不需要指定长度,切片结构体内部存储三个字段:指向底层数组的指针、切片长度、切片容量。切片赋值时拷贝的是这个结构体本身,内部的指针还是指向同一个底层数组,所以修改任意一个切片的元素,本质是修改共享的底层数组内容,另一个切片读取时自然会拿到修改后的值。
你可以对比两段代码的运行效果:
- 你的原切片场景代码
func main() { arr := []int{0,0,0} // 无长度声明,是切片 arr2 := arr arr[1] = 1 fmt.Println(arr, arr2) // 输出 [0 1 0] [0 1 0] }
- 真正的数组场景代码
func main() { arr := [3]int{0,0,0} // 指定长度,是数组 arr2 := arr arr[1] = 1 fmt.Println(arr, arr2) // 输出符合你的预期:[0 1 0] [0 0 0] }
资料中提到的Go数组是值类型的表述完全正确,只需要注意区分字面量声明时有没有带长度,不带长度的就是切片,不要把两种类型搞混即可。
内容的提问来源于stack exchange,提问作者afraid.jpg
相关产品推荐
相关产品推荐

