2021年6月25日 星期五

A pointer variable in the loop statement of Golang

雖然這幾個月幾乎都用 Golang 做事,但我學 Golang 已經是好幾年前的事,即使買了也看了好幾本書,但因為中間都沒有用它來做什麼專案,故很多坑洞都要等到真的碰到才知道發生什麼事了?

當然這裡的坑洞指的不是 Golang 本身的缺限,而是因為不常用所衍生出來的問題XD

今天下午就讓我碰到一個問題,我也是直到剛才把程式簡化才明白發生了什麼事?

簡單來說,如果我有一個 slice 裡面存放的是指標變數,在使用 for loop 語法時,在 for loop 裡面的那個指標變數,假設我們稱它為 p 好了,索引值假設是 0,也就是第 0 個元素。

此時雖然 p 和 slice[0] 指的都是同一個實體的位址,但 p 只是另外一個指標變數,並不等於 slice[0] 的那個變數,故假設我們把 p 指向另外一個實體的位址,原本 slice[0] 指的還是原本的地方。


整體概念其實有點像 C,也就是要變成指標的指標,才能將原本 slice[0] 指到另外一個位址,當然 Golang 裡面沒有這種東西,故我們要直接使用 slice[0] 變數,而不要使用 p 變數 。

模擬程式如下:


package main

import (
    "fmt"
)

type Device struct {
    ID string
}

type Arg struct {
    Devices []*Device
}

func main() {
    arg := Arg {
        Devices : []*Device{
            &Device {
                ID : "1",
            },
            &Device {
                ID : "2",
            },
        },
    }

    d3 := &Device {
        ID : "3",
    }

    for i, d := range arg.Devices {
        fmt.Printf("idx(%d) d=%p arg.Devices[%d]=%p d3=%p\n", i, d, i, arg.Devices[i], d3)
        //d = d3
        arg.Devices[i] = d3
        fmt.Printf("idx(%d) d=%p arg.Devices[%d]=%p d3=%p\n", i, d, i, arg.Devices[i], d3)
    }

    for i, d := range arg.Devices {
        fmt.Println(i, d.ID)
    }
} 

沒有留言:

張貼留言