golang工作笔记(二)值传递与引用传递

446 阅读2分钟
上篇文章写了指针,大概的意思指针变量记录的都是地址,那么它实际运用在什么上面呢?

我们先来看一段代码

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创建