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

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 <p>代码中,切片 arr 作为值传递给 examplefunc 函数。然而,函数内对切片元素 arr[0] 和 arr[1] 的修改却能在外部 m<a style="color:#f60; text-decoration:underline;" href="https://www.php.cn/zt/17539.html" target="_blank">ai</a>n 函数中反映出来。相反,向切片追加元素的操作却无效。</p><p><strong>背后的原理:共享底层数组</strong></p><p>虽然切片是值传递,但它们共享一个底层数组(称为 underlying array)。底层数组才是实际存储切片元素的内存空间。函数外部的切片和函数内部的切片虽然是不同的变量,但它们共享同一个底层数组,这意味着对底层数组的修改将影响到所有指向该数组的切片。</p><p><strong>修改元素对底层数组的影响</strong></p><p>通过下标修改切片元素时,我们实际上在修改底层数组中的元素。这种修改对共享该底层数组的所有切片都是可见的,无论它们是否在函数内部。因此,examplefunc 中的 arr[0] 和 arr[1] 的修改能够被外部 main 函数观察到。</p><p><strong>追加元素对底层数组的影响</strong></p><p>然而,append 函数在切片末尾追加元素时,它可能会需要更大的底层数组。在这种情况下,append 会创建一个新的底层数组,并将切片中的元素复制到新的数组中。这意味着返回的新切片不再与输入的切片共享同一个底层数组。因此,examplefunc 中对 arr 的追加操作不会影响到外部 main 函数的 arr 切片。</p>

以上就是Go 语言中切片值传递为何能修改外部切片的元素?的详细内容,更多请关注其它相关文章!