学习golang的时候发现没有引用类型可以用,会有一些代码写的很丑!所以这里学习了解一下C语言和golang指针之间的区别
首先是引发问题的代码:
package main
import "fmt"
type user struct {
name string
age int
}
func main() {
userInfo := user{"张三", 20}
fmt.Println(userInfo)
updateUserInfo(userInfo)
fmt.Println(userInfo)
}
func updateUserInfo(userInfo user) {
userInfo.name = "王二"
userInfo.age = 15
}
运行结果如下:
这里可以发现因为传递的数据类型是 struct 值类型在很多其他语言中我们也应该有所了解, 所以值当然不会改变,但是golang没有引用类型的概念。
接下来的代码是我未了解指针的时候所临时想到的补救方法:
package main
import "fmt"
type user struct {
name string
age int
}
func main() {
userInfo := user{"张三", 20}
fmt.Println(userInfo)
userInfo = updateUserInfo(userInfo)
fmt.Println(userInfo)
}
func updateUserInfo(userInfo user) user {
userInfo.name = "王二"
userInfo.age = 15
return userInfo
}
可以看到值改变了,不过此种方式已经更换了对象的地址,原来的对象已经被抛弃掉了。
下面的代码是使用golang中带有的指针概念。
package main
import "fmt"
type user struct {
name string
age int
}
func main() {
userInfo := user{"张三", 20}
fmt.Println(userInfo)
updateUserInfo(&userInfo)
fmt.Println(userInfo)
}
func updateUserInfo(userInfo *user) {
userInfo.name = "王二"
userInfo.age = 15
}
可以看到通过指针我们就不需要在将user struct return回来了。而是真真切切的修改原有struct的值,当然也不会丢弃掉原有对象。 但是这里是会产生一个存有 userInfo地址的指针对象。
如果只是使用到此种地步的话,感觉是类似于C#中ref,对于值类型的变量进行修改。
下面的Blog 对于golang 和C的指针有更多的例子: https://blog.csdn.net/zhjih123/article/details/38961661