上篇文章寫了指針,大概的意思指針變量記錄的都是地址,那麼它實際運用在什麼上面呢?
咱們先來看一段代碼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
建立