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

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

咱们先来看一段代码golang

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函数当初bash

那么咱们想经过一个函数修改这两个值呢?函数

在简单加一个函数ui

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他将第一个参数和第二个参数的值修改了,那么咱们打印的结果以下spa

6 7复制代码

咱们发现仍是6和7指针

这是由于golang在传变量的时候是用的值传递code

什么是值传递?cdn

简单来讲就是在进行传值的时候传的仅仅是变量的值,而不是变量自己。blog

说出来有点拗口,我用图来简单说明一下

这是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建立

相关文章
相关标签/搜索