学习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