登录
首页 >  Golang >  Go教程

Go 语言中切片值传递为何能修改外部切片的元素?

时间:2024-12-09 18:39:49 440浏览 收藏

从现在开始,努力学习吧!本文《Go 语言中切片值传递为何能修改外部切片的元素?》主要讲解了等等相关知识点,我会在golang学习网中持续更新相关的系列文章,欢迎大家关注并积极留言建议。下面就先一起来看一下本篇正文内容吧,希望能帮到你!

Go 语言中切片值传递为何能修改外部切片的元素?

go 语言中切片值传递的困惑

尽管 go 语言中一切都是值传递,但我们却发现修改函数内部切片的元素竟然能影响到外部切片。这是为何?

示例代码如下:

func exampleFunc(arr []int) {
    arr[0] = 100
    arr[1] = 101
    
    arr = append(arr, 111)
}

func main() {
    arr := make([]int, 2, 5)
    for i := 0; i < len(arr); i++ {
        arr[i] = i
    }
    exampleFunc(arr)
    for i := 0; i <len(arr); i++ {
        fmt.Printf("%d\n",arr[i]) //输出100 101
    }
}

代码中,切片 arr 作为值传递给 examplefunc 函数。然而,函数内对切片元素 arr[0] 和 arr[1] 的修改却能在外部 main 函数中反映出来。相反,向切片追加元素的操作却无效。

背后的原理:共享底层数组

虽然切片是值传递,但它们共享一个底层数组(称为 underlying array)。底层数组才是实际存储切片元素的内存空间。函数外部的切片和函数内部的切片虽然是不同的变量,但它们共享同一个底层数组,这意味着对底层数组的修改将影响到所有指向该数组的切片。

修改元素对底层数组的影响

通过下标修改切片元素时,我们实际上在修改底层数组中的元素。这种修改对共享该底层数组的所有切片都是可见的,无论它们是否在函数内部。因此,examplefunc 中的 arr[0] 和 arr[1] 的修改能够被外部 main 函数观察到。

追加元素对底层数组的影响

然而,append 函数在切片末尾追加元素时,它可能会需要更大的底层数组。在这种情况下,append 会创建一个新的底层数组,并将切片中的元素复制到新的数组中。这意味着返回的新切片不再与输入的切片共享同一个底层数组。因此,examplefunc 中对 arr 的追加操作不会影响到外部 main 函数的 arr 切片。

好了,本文到此结束,带大家了解了《Go 语言中切片值传递为何能修改外部切片的元素?》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>