加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Go 语言的传参和传引用

发布时间:2020-12-16 18:48:00 所属栏目:大数据 来源:网络整理
导读:传参和传引用问题,在golang 的一些教材中多有描述,现在再温习一遍 Golang的函数调用参数全部是传值得,包括 slice/map/chan 在内的所有类型,没有传引用的说法 所有类型的函数参数都是传值的,包括slice/map/chan等基础类型和自定义的类型 但是因为 slice

传参和传引用问题,在golang 的一些教材中多有描述,现在再温习一遍

  1. Golang的函数调用参数全部是传值得,包括 slice/map/chan 在内的所有类型,没有传引用的说法

所有类型的函数参数都是传值的,包括slice/map/chan等基础类型和自定义的类型

但是因为 slice 和 map/chan 底层结构的差异,又导致了它们传值得影响并不完全等同

归纳如下:

  • Golang 所有函数参数都是传值的

  • map/slice/chan 都是传值,不是传引用

  • map/chan 对应指针,和引用类似

  • slice是结构体和指针的混合体

slice 含有 values/count/capacity 等信息,是按值传递

slice中的values是指针,按值传递

按值传递的slice 只能修改values指向的数据,其他都不能修改

  1. Golang语言有引用的说法吗?

Golang的语言也是有传引用的地方的,但是不是函数的参数,而是闭包对外部环境是通过引用访问的

coding:

func main() {

a:= new(int)

fmt.Println(a)

func(){ a= nil }()

fmt.Println(a)

}

输出为:

0xc010000000 <nil>

因为闭包是通过引用的方式使用的外部环境的a变量,因此可以直接修改a的值。

闭包的概念、形式与引用 http://www.ibm.com/developerworks/cn/linux/l-cn-closure/index.html

如果不想修改a的值,避免闭包的副作用,回避的办法是通过参数传值或 每次闭包构造不同的临时变量

方法一:

for i:=0; i<5; i++ {

i := i

defer func() {

fmt.Printf(" %d ",i )

}()

}


方法二:

for i:= 0; i<5; i++ {

defer func(i int) {

fmt.Printf("%d ",i)

}(i)

}

  • 总结:

  • 函数参数传值,闭包传引用

  • map、chan 本身是指针,近似于引用传递

  • slice 含有 values/count/capacity 等信息,是按值传递

  • 按值传递的 slice 只能修改values指向的数据

  • slice是结构体和指针的混合体

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读