首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

go语言中函数参数传值还是传引用的思考

算起来这些年大大小小也用过一些不同编程语言,但平时开发还是以C++为主,得益于C++精确的语义控制,我可以在编写代码的时候精准地控制每一行代码的行为,以达到预期的目的。但是C++的这种强大的语义控制,就带来了极多的概念和极大的学习成本,几乎逼着使用者不得不去了解该语言中的所有细节行为,以防出现意料之外的情况。新时代的语言如golang等,较之C++就好比美图秀秀对比photoshop(绝非贬义),同样都提供了修图的功能,但是前者屏蔽了诸多细节,更傻瓜式且易于使用,一样能达到好的效果;而后者则提供了更多专业的编辑手段,能够满足更精细化更底层的需求,但是随之而来的就是巨大的学习成本。显然两者各有优劣,但是对当今快速发展的互联网来说,以golang为代表的新时代语言更加能够适应敏捷开发的模式,比较起来,C++这些前辈还是“太重”了。

04

go的值传递和引用传递以及引用类型的问题

package main import( "fmt" ) // int string 参数传递是值传递 非引用类型 // map 参数传递是值传递 引用类型 var a int = 9 var b string = "aa" var c map[int]int func modify1(a int) { fmt.Println("值:",a) fmt.Println("地址:",&a) a = 10 fmt.Println("值:", a) fmt.Println("地址:", &a) } func modify2(a string) { fmt.Println("值:",a) fmt.Println("地址:",&a) a = "cccc" fmt.Println("值:", a) fmt.Println("地址:", &a) } func modify3(a map[int]int) { fmt.Println("值:",a) fmt.Printf("地址:%p\n",&a) a[4] = 10 fmt.Println("值:", a) fmt.Printf("地址:%p\n",&a) } func main(){ fmt.Println("值:", a) fmt.Println("地址:", &a) modify1(a) fmt.Println("值:", a) fmt.Println("地址:", &a) fmt.Println("值:", b) fmt.Println("地址:", &b) modify2(b) fmt.Println("值:", b) fmt.Println("地址:", &b) c = make(map[int]int) c[4] = 9 fmt.Println("值:", c) fmt.Printf("地址:%p\n", &c) modify3(c) fmt.Println("值:", c) fmt.Printf("地址:%p\n", &c) } //Go语言中所有的传参都是值传递(传值),都是一个副本,一个拷贝。因为拷贝的内容有时候是非引用类型(int、string、struct等这些),这样就在函数中就无法修改原内容数据;有的是引用类型(指针、map、slice、chan等这些),这样就可以修改原内容数据。是否可以修改原内容数据,和传值、传引用没有必然的关系。在C++中,传引用肯定是可以修改原内容数据的,在Go语言里,虽然只有传值,但是我们也可以修改原内容数据,因为参数是引用类型。这里也要记住,引用类型和传引用是两个概念。再记住,Go里只有传值(值传递)。

02
领券