You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言中为什么array的值可以被另一个变量修改?

问题核心原因:你混淆了Go中的数组(array)和切片(slice)

你示例代码中声明的arr := []int{0,0,0}不是数组类型,是切片类型,这是运行结果和预期不符的根本原因。

两者的核心区别如下:

  • 数组是值类型,声明时必须指定固定长度,比如[3]int才是长度为3的int数组。数组赋值时会完整拷贝所有元素,修改其中一个数组实例完全不会影响另一个,符合你对值类型的认知。
  • 切片是带引用语义的结构体类型,声明时不需要指定长度,切片结构体内部存储三个字段:指向底层数组的指针、切片长度、切片容量。切片赋值时拷贝的是这个结构体本身,内部的指针还是指向同一个底层数组,所以修改任意一个切片的元素,本质是修改共享的底层数组内容,另一个切片读取时自然会拿到修改后的值。

你可以对比两段代码的运行效果:

  1. 你的原切片场景代码
func main() {
    arr := []int{0,0,0} // 无长度声明,是切片
    arr2 := arr

    arr[1] = 1

    fmt.Println(arr, arr2)
    // 输出 [0 1 0] [0 1 0]
}
  1. 真正的数组场景代码
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 16:27:02