發現 golang 的 map 型別的元素比較特殊,也就是不能夠取地址
禁止對 map 元素取址的原因是 map 可能隨著元素數量的增長而重新分配更大的記憶體空間,從而可能導致之前的地址無效。想了下,感覺 slice 應該也是一樣不能取地址的,因為都是引用型別,自己寫程式碼測試了下,slice 是允許取地址操作的。
package main
import "fmt"
func main() {
s1 := make([]int,1,1)
s1[0] =1
fmt.Println(&s1[0])//可以取地址
s1 = append(s1,2)//擴容
fmt.Println(&s1[0])//兩次地址不一樣,說明重新複製了一份
}
這跟 slice 的底層陣列有關係,底層陣列裡還有額外的容量可用,append 操作將可用的元素合併到切片,並對其進行賦值,所以元素的記憶體地址可以取到。
如果切片的底層陣列沒有足夠的可用容量,append 函式會建立一個新的底層陣列,將被引用的現有的值複製到新陣列裡再追加新的值,這裡也可以取到元素的新的記憶體地址。
本作品採用《CC 協議》,轉載必須註明作者和本文連結