Go 之基礎速學 (五) golang 裡函式以及函式之間引數的傳遞

huxiaobai_001發表於2020-05-06
package main
import "fmt"
//main函式是入口函式  不能有引數 也不能有返回值
func main(){
   //函式的引數傳遞 案例一
       //me := "huxiaobai"
       //fmt.Println(me) //此處傳遞過去的是me的記憶體塊裡面的值 而不是記憶體的地址 所以在test函式裡面對p進行修改不會影響me的值
       //test(me)
       //fmt.Println(me) 
   //函式的引數傳遞 案例二
       //me := "wangxiaoer"
       //fmt.Println(me) //此處傳遞過去的是me的記憶體地址 &me可以獲取到記憶體塊的記憶體地址
       //test1(&me)
       //fmt.Println(me) 
  //函式的引數傳遞 案例三
  //總結:golang當中函式的引數傳遞都是按照值來進行傳遞的 雖然傳遞指標的時候你感覺是在傳遞指標其實傳遞的還是指標指向的記憶體區域塊 那就還是值
  //這個地方確實不大好理解 但是你把指標傳遞過去修改指標為nil回過頭來列印指標的記憶體地址是沒變的 這就說明傳遞指標其實就是傳遞的指標指向的記憶體區域塊裡面的值
  //宣告一個var_type為string型別的指標 var u *string; u = new(string)是一樣的效果
      u:=new(string)
      //*u 表示為指標指向的記憶體區域賦值
      *u = "wocao"
      fmt.Println(*u)
      //呼叫test(u) 傳遞過去的是指標指向的記憶體區域
      test2(u)
      fmt.Println(*u)
}

//配合函式的引數傳遞 案例一
func test(p string){
   //呼叫test傳遞的引數是記憶體塊的值 而不是記憶體地址 在這裡p = "abc" 那麼重新開闢了記憶體區域 和上邊的me沒有任何的牽扯
  p = "abc"
  fmt.Println(p)
}

//配合函式的引數傳遞 案例二
func test1(p *string){
   //p *string 表示p是一個指標 指標指向記憶體地址哈 其實就是在宣告 比如可以理解為 var p *string //*p = "wahaha"  *號我們之前就講過可以獲取指標指向的記憶體地址的值 也可以設定指標指向的記憶體地址的值 這樣通過指標的形式我們就改變了上邊me的值
  *p = "wahaha"
}

//配合函式的引數傳遞 案例三
func test2(p *string){
   //呼叫方傳遞過來的是指標指向的記憶體區域
  //這裡*p為指標指向的記憶體區域賦值 從而導致上邊的u的值發生變化
  *p = "made"
}

直接上程式碼吧,因為註釋裡面寫的很詳細了!
很重要的一句話:
golang裡面引數傳遞的實參為指標指向的記憶體地址塊的這種形式很類似於php裡面的引用傳參,就是一個道理!

本作品採用《CC 協議》,轉載必須註明作者和本文連結

胡軍

相關文章