上篇文章写了指针,大概的意思指针变量记录的都是地址,那么它实际运用在什么上面呢?
咱们先来看一段代码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
建立