4

golang切片使用append函数的引用传递问题

 1 year ago
source link: https://studygolang.com/articles/36058
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

golang切片使用append函数的引用传递问题

zhuqingping · 大约10小时之前 · 182 次点击 · 预计阅读时间 1 分钟 · 大约8小时之前 开始浏览    

在函数中使用append,函数结束返回后,切片的长度不会增加,这是什么原因呢,是我写的、理解有问题,还是说官网的设定就是如此

//我的代码,版本1.20
func sliceTest(arr []byte){
    arr[0] = '1'
    arr[1] = '2'
    arr = append(arr,'0')
}
func main(){
    var testStr []byte = []byte{'a','b','c'}
    fmt.Printf("Address:%p\n",&testStr)
    fmt.Println(testStr,"len:",len(testStr),"cap:",cap(testStr))
    sliceTest(testStr)
    fmt.Println(testStr,"len:",len(testStr),"cap:",cap(testStr))
    fmt.Printf("Address:%p\n",&testStr)
}
我的运行结果

81c83b8fc0172e76b5d6de2402e1992f.png


有疑问加站长微信联系(非本文作者)

280

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3 回复  |  直到 2023-02-27 10:01:42

新 百胜网纸——w w w.xbs0687.vip——【微电;18488342505】备用微信【xbs0687】?携手永盈?共创辉煌?展鸿鹄之志?赢未来天下?万人推荐?经验丰富?专业技术?具备顶尖技术?曾服务上千案例?一对一耐心指导? 第四部《美国队长》将于2024年5月3日上映,所以他们必须尽快投入制作,Onah透露他们将在明年年初开始拍摄。他还分享说他们已经在进行项目的前期制作,“我们已经很忙了,把一切都放在一起。正如你所知道的,这些电影有很多元素,在演员、剧本、效果和特技之间。能真正深入其中真的很令人兴奋。”总策划:莫言 策划:马云、李彦宏 监制:雷军、许家印 统筹:任正非、柳传志、方洪波 文字:李嘉诚、董明珠、宗庆后 编辑:王兴、杨元庆 视频:沈南鹏 视觉/海报:字节跳动、张一鸣 新华社国内部 新华社广东分社 联合出品 免责声明:本文来自腾讯新闻客户端自媒体,该文观点仅代表作者本人,搜狐号、网易号、企鹅号、百家号系信息发布平台,本平台仅提供信息存储

zhuqingping · #2 · 大约10小时之前

我对此很困惑,希望有大佬能帮忙解答一下

guokun1998 · #3 · 大约2小时之前

传入的是引用这段切片的拷贝,函数内外其实已经是两个切片了。使用指针作为参数,则传入的是切片指针,有不一样的效果。

func TestName(t *testing.T) {
    var testStr []byte = []byte{'a','b','c'}
    fmt.Printf("Address:%p\n",&testStr)
    fmt.Println(testStr,"len:",len(testStr),"cap:",cap(testStr))
    sliceTest(testStr)
    fmt.Println(testStr,"len:",len(testStr),"cap:",cap(testStr))
    fmt.Printf("Address:%p\n",&testStr)
}

func sliceTest(arr []byte){
    fmt.Printf("Address:%p\n",&arr)
    arr[0] = '1'
    arr[1] = '2'
    arr = append(arr,'0')
    fmt.Println(arr)
    fmt.Printf("Address:%p\n",&arr)
}
func sliceTest1(arr *[]byte){
    (*arr)[0] = '1'
    (*arr)[1] = '2'
    (*arr) = append(*arr,'0')
    fmt.Println(arr)
}

jan-bar · #4 · 大约2小时之前

go语言任何传值都是值传递,因此函数内部arr和外部arr实际上是不同的变量,但是指针指向同一个切片地址,因此函数内部修改切片影响了外部。但是函数内部append赋值给内部的arr,因此函数内部的arr发生了扩容指针指向了新切片地址,但是外部arr还是指向原来切片地址。

要深入理解go里面的赋值可以看我这篇文章: https://www.cnblogs.com/janbar/p/17072751.html

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK