Go 的 & 取址與 * 解參考

兩者互為反向操作:& 把值打包成位址* 把位址拆開看裡面

x := 10
p := &x          // & 取址:拿到 x 的記憶體位址,p 的型別是 *int
fmt.Println(*p)  // * 解參考:順著位址去拿值 → 10
*p = 99          // 順著位址去「寫」
fmt.Println(x)   // → 99,改到的是 x 本人

* 這個符號在兩種位置意思不同,這是初學最容易混淆的地方:

符號型別位置運算式位置
**int = 「指向 int 的指標」這個型別*p = 取出 p 指到的值
&(不出現)&x = 取得 x 的位址

所以 make([]*int, 3) 讀作「一個裝三個 int 指標的 slice」,而 *ptrs[0] 讀作「把第 0 個指標拆開看值」。

相關:Go 1.22 起迴圈變數每次疊代各自一份Go 傳 slice 是複製 header 而不是 pass by reference