golang函数究竟是值传递还是引用传递?打赏
接上文,踩完php的坑,又遇到golang,golang和之前提到过的Java、JavaScript类似。
在golang中只存在值传递(要么是该值的副本,要么是指针的副本),不存在引用传递。之所以对于引用类型的传递可以修改原内容数据,是因为在底层默认使用该引用类型的指针进行传递,但是也是使用指针的副本,依旧是值传递。
如上,golang的传参形式和Java、JavaScript一致,但又有差别,golang要在声明struct或者变量时用*标识用指针,否则方法内不能修改外部的值。
同样的,举个例子
func main() { i:=19 p:=People{name:"lily",age:&i} fmt.Println(p) modify(p) fmt.Println(p) } type People struct { name string age *int } func (p People) String() string{ return "name:" + p.name + ",age:"+ strconv.Itoa(*p.age) } func modify(p People){ p.name = "lucy" *p.age = 20 } // 输出结果 // name:lily,age:19 // name:lily,age:20 // 换个角度,modify改为 func modify(p *People){ p.name = "lucy" *p.age = 20 } // 调用改为 modify(&p) // 输出结果则为 // name:lily,age:19 // name:lucy,age:20 // 当然,也可以把struct改成这样 func main() { n:="lily" i:=19 p:=People{name:&n,age:&i} fmt.Println(p) modify(p) fmt.Println(p) } type People struct { name *string age *int }
同上篇,这样看来,似乎也解决了不少问题,但是同样的问题,如果大量在函数内修改结构体内部数据,依然有违函数式编程思想,对此只能说仁者见仁智者见智了,大家根据需求自行选择吧。
- 固定链接:https://www.poorren.com/golang-function-passed-by-reference-or-value-transfer
- 文章标签:go,golang,值传递,引用传递
- 扫二维码:golang函数究竟是值传递还是引用传递?
- 版权所有:除"转载分享"分类外,未经注明,均为原创、整理,转载请注明出处。
挺好的,学习了!nsyt
文章不错非常喜欢,支持一下
965影视:http://www.965ys.net
博主你好,友链考虑下不?
不考虑了
真心不错,不得不支持一下先!
文章不错非常喜欢