为什么 Go 函数内修改切片元素会在外部生效?
Go 中普遍采用值传递,因此函数对变量的修改通常不会影响外部作用域中的变量。然而,当函数的参数是切片时,一个例外的情况出现了。
在函数内,使用索引修改切片的元素确实会反应到外部,这是因为:
- 切片是值传递的,但它们实际上是共享该切片底层数组的引用。
- 对切片元素的索引修改直接修改了底层数组,因此这些修改在外部作用域中也是可见的。
然而,当使用 append 函数向切片添加值时,情况会发生一些变化:
- append 函数会为切片创建一个新的底层数组,如果原来数组空间不足的话。
- 因此,返回的切片与输入的切片不再共享相同的底层数组。
- append 不会修改输入的切片,而是返回一个新的切片,该切片的大小也可能与输入的切片不同。
暂无评论内容