golang工作筆記(二)值傳遞與引用傳遞

xjlgxlgx發表於2019-09-15
上篇文章寫了指標,大概的意思指標變數記錄的都是地址,那麼它實際運用在什麼上面呢?

我們先來看一段程式碼

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變數

golang工作筆記(二)值傳遞與引用傳遞

它有自己的地址和它的變數值

那麼值傳遞傳的僅僅是他的變數值: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工作筆記(二)值傳遞與引用傳遞

我們傳遞了變數地址,然後通過解應用符號*來給變數賦新值以此來改變變數的的值。

這就值傳遞和引用傳遞的區別

在golang集合型別中陣列和結構體是值傳遞用關鍵字new關鍵字建立

而map和切片是引用傳遞用關鍵字make建立


相關文章