當然這裡的坑洞指的不是 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)
}
}
沒有留言:
張貼留言