go map 和 slice

miss201發表於2018-08-03

發現 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])//兩次地址不一樣,說明重新複製了一份
}

file
這跟 slice 的底層陣列有關係,底層陣列裡還有額外的容量可用,append 操作將可用的元素合併到切片,並對其進行賦值,所以元素的記憶體地址可以取到。
如果切片的底層陣列沒有足夠的可用容量,append 函式會建立一個新的底層陣列,將被引用的現有的值複製到新陣列裡再追加新的值,這裡也可以取到元素的新的記憶體地址

本作品採用《CC 協議》,轉載必須註明作者和本文連結

不卑不亢,不慌不忙,這才是生活的模樣。

相關文章