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

相關文章
相關標籤/搜索