上篇文章写了指针,大概的意思指针变量记录的都是地址,那么它实际运用在什么上面呢?
我们先来看一段代码
package main
import "fmt"
func shownum(i int, i2 int) {
fmt.Println(i,i2)
}
func main() {
var num1 int = 6
var num2 int = 7
shownum(num1,num2)
return
}输出结果如下
6 7我们通过参数将num1和num2的值传到了shownum函数当初
那么我们想通过一个函数修改这两个值呢?
在简单加一个函数
package main
import "fmt"
func changenum(i int,i2 int) {
i=9
i2=10
}
func shownum(i int, i2 int) {
fmt.Println(i,i2)
}
func main() {
var num1 int = 6
var num2 int = 7
changenum(num1,num2)
shownum(num1,num2)
return
}我们加了一个新的函数changenum他将第一个参数和第二个参数的值修改了,那么我们打印的结果如下
6 7我们发现还是6和7
这是因为golang在传变量的时候是用的值传递
什么是值传递?
简单来说就是在进行传值的时候传的仅仅是变量的值,而不是变量本身。
说出来有点拗口,我用图来简单说明一下
这是num1变量
它有自己的地址和它的变量值
那么值传递传的仅仅是他的变量值:6,而传递完以后我们对它就无法进行操作
我们想通过函数修改变量应该怎么写?
package main
import "fmt"
func changenum(i *int,i2 *int) {
*i=9 *i2=10
}
func shownum(i int, i2 int) {
fmt.Println(i,i2)
}
func main() {
var num1 int = 6
var num2 int = 7
changenum(&num1,&num2)
shownum(num1,num2)
return
}输出结果如下
9 10为什么这时就能修改了呢
因为我们这是引用传递,应用传递可以理解传递的是变量自身,而不是仅仅是变量的值(传递的实际是变量地址)
我们传递了变量地址,然后通过解应用符号*来给变量赋新值以此来改变变量的的值。
这就值传递和引用传递的区别
在golang集合类型中数组和结构体是值传递用关键字new关键字创建
而map和切片是引用传递用关键字make创建