登录
首页 >  Golang >  Go问答

golang都是值传递,为什么在函数内修改切片的元素还能反应到外部?

来源:SegmentFault

时间:2023-02-16 15:25:31 236浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《golang都是值传递,为什么在函数内修改切片的元素还能反应到外部?》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下go,希望所有认真读完的童鞋们,都有实质性的提高。

问题内容

func exampleFunc(arr []int) {
    arr[0] = 100
    arr[1] = 101
    
    arr = append(arr, 111)
}
func main() {
    //创建一个int slice
    arr := make([]int, 2, 5)
    //给切片添加元素
    for i := 0; i 

为什么在函数内通过索引可以改切片的元素,append函数却不行?

正确答案

slice 是值传递。

但是,slice 有一个 underlying array ,并不是 slice 的一部分,而只是一个引用。就是说,拷贝 slice 得到一个新的 slice ,但是他们共享了同一个underlying array 。通过下标修改内容,直接修改了 underlying array 里的内容,所以外部可见。

append 会向 slice 中添加值,这就带来一个问题,就是 underlying array 可能空间不够了。这个时候就,append 返回的 slice 会使用一个新的(更大的)underlying array 。于是返回的 slice 与输入的 slice 就不再共享同一个 underlying array 。
同时,append 没有修改输入的 slice,而是返回一个新 slice ,返回的 slice 与输入的 slice 长度也是不同的。

到这里,我们也就讲完了《golang都是值传递,为什么在函数内修改切片的元素还能反应到外部?》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于golang的知识点!

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表