首頁  >  文章  >  後端開發  >  關於go值傳遞和地址傳遞的例子

關於go值傳遞和地址傳遞的例子

藏色散人
藏色散人轉載
2020-10-30 15:00:202312瀏覽
##上建立中「由

golang教學欄位傳遞給大家介紹與地址傳遞和地址傳遞的例子,希望對需要的朋友有所幫助!

關於go值傳遞和地址傳遞的例子

先來看個簡單的例子

#1、變數前面加個&表示這個變數的位址(也就是這個變數的指標),指標變數前面加上*表示這個指標針對應的值(自己理解下)

//main.gopackage main
func ByAss() {
  s := 100
  p := &s  // s 的地址给了p

  fmt.Println(*p) //100 所以p对应的值变成了100
  *p += 100
  fmt.Println(*p)  //200
  fmt.Println(s) //200 p和s相同的地址,所以s也变成200}//demo.gopackage main
func main() {
  ByAss()}
Go 預設使用按值傳遞來傳遞參數,也就是傳遞參數的副本。函數接收參數副本之後,在使用變數的過程中可能會對副本的值進行更改,但不會影響到原來的變量,例如 Function(arg1)。

2、普通值傳遞(注意這個例子,看起來很簡單,但是容易忽略)

func ByValue1(n1 int) {
  //此时n1 是n 的一个拷贝,所以地址不一样
  fmt.Println(&n1)//0xc00000a098}package main
func main() {
  n := 100
  fmt.Println(&n) //0xc00000a090
  ByValue1(n)//传递副本}
如果你希望函數可以直接修改參數的值,而不是對參數的副本進行操作,你需要將參數的位址(變數名稱前面加上& 符號,例如&variable)傳遞給函數,這就是按引用傳遞,例如Function(&arg1),此時傳遞給函數的是指針。

3、如果想用位址傳遞

func main() {
    n := 100
    fmt.Println(&n) //0xc00000a090
    ByReference(&n) //传递指针
    fmt.Println(n) //200}//注意函数 参数类型需要是用指针符号(*)func ByReference(n1 *int) {

   *n1 += 100
   fmt.Println(n1)//0xc00000a090 地址与n相同, 所以n值被改变了
  //注意
  //ip := &n1//这个写法有问题,表示地址的地址
  //fmt.Println(ip)}

#4、看下陣列

    (a)陣列也是值傳遞
arr := [5]int{1,3,5,6,7}arrByValue(&arr) //也需要使用& 符号fmt.Println(arr) //[100 300 5 6 7]func arrByValue(arr1 *[5]int) {
 arr2 := arr1
 arr2[0] = 100
 arr2[1] = 300}
  • 5、下面是切片的範例(可變的陣列)切片是引用傳遞
    func main() {
        arr := []int{1,3,5,6,7}
        bbb(arr) //没有使用& 符号
        fmt.Print(arr[0])// 11 结果已经改变,说明数组是地址传递
    
        //就算不通过函数,也是引用传递
        //arr := []int{1,3,5,6,7}
        //arr2 := arr
        //arr2[1] = 0
        //fmt.Print(arr)//[1 0 5 6 7]}//aaafunc bbb(arr1 []int) {
       arr1[0] += 10}

      (b)在函數呼叫時,像切片(slice)、字典(map)、介面(interface)、通道(channel)這樣的引用類型都是預設使用參考傳遞(即使沒有明確的指出指標)。

    以上是關於go值傳遞和地址傳遞的例子的詳細內容。更多資訊請關注PHP中文網其他相關文章!

  • 陳述:
    本文轉載於:learnku.com。如有侵權,請聯絡admin@php.cn刪除