前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >答网友问:golang中的slice作为函数参数时是值传递还是引用传递?

答网友问:golang中的slice作为函数参数时是值传递还是引用传递?

作者头像
Go学堂
发布2023-08-29 16:44:38
4480
发布2023-08-29 16:44:38
举报
文章被收录于专栏:Go工具箱Go工具箱

大家好,我是渔夫子。

今天有网友问通道和切片在赋值给另一个变量或作为函数参数传递的时候是不是引用传递?因为老师在讲解的时候说是指针传递?

先说结论:在Go语言中都是值传递,没有引用传递

看看网友的提问:

我们以slice为例,来看一下:

代码语言:javascript
复制
package main

import (
"fmt"
)

func main() {
 a := make([]int, 10, 10)
 fmt.Println("a", a)
 b := a
 b[0] = 10
 fmt.Println(a,b)
}

该示例是将a赋值给b。然后将b中的第一个元素更改成10。那么,a中的第一个元素也将会是10。那这是为什么呢?这个要从slice的底层数据结构来找答案。如下:

slice的底层结构其中一个实际上是有一个指针,指向了一个数组。那么,在把a赋值给b的时候,只是把slice的结构也就是Array、Len和Cap复制给了b,但Array指向的数组还是同一个。所以,这就是为什么更改了b[0],a[0]的值也更改了的原因。

另外,在Go中还有chan类型、map类型等都是同样的原理。所以大家一定不要混淆。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-07-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Go学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档