golang之slice和map比較

最近在看golang的時候發(fā)現(xiàn)golang的map類型的元素比較特殊,也就是不能夠取地址。因為map實際上是一張hash表,當(dāng)map元素數(shù)量增加的時候,當(dāng)前分配的內(nèi)存不足以存放新的數(shù)據(jù),就會重新分配更大的內(nèi)存空間,并把原有的數(shù)據(jù)遷移過來。因此以前的地址保存的就不是當(dāng)前map中的元素了。

思考了一下,slice應(yīng)該也是類似的但是slice是允許取地址操作的,因此做了一個小驗證:

s1 := make([]string, 1, 1)

s1[0] = "a"

a := &s1[0]

*a = "c"

fmt.Println(s1)//output: [c]

s1 := make([]string, 1, 1)

s1[0] = "a"

a := &s1[0]

s1 = append(s1, "b")

*a = "c"

fmt.Println(s1) //output:[a b]

強制定義一個cap為1的slice,并放入一個"a",然后使用a變量保存這個地址,更改a變量指向的值,發(fā)現(xiàn)slice確實也跟著變了,這是因為只是修改slice的元素,沒有發(fā)生slice的增容,因此slice元素的值和a變量指向的是同一個值。

第二段代碼唯一的區(qū)別就是在a變量指向slice的第一個值后,強制增容了slice,導(dǎo)致slice重新分配內(nèi)存空間,這個時候修改a變量指向的值,slice并沒有變化,意味著這個時候a變量和slice的第一個元素已經(jīng)不是指向同一個變量了。

阿里云雙十一云服務(wù)器拼團活動,已經(jīng)打到最低價99元一年!有需要的可以考慮一波了!

https://m.aliyun.com/act/team1111/#/share?params=N.9g4CZ2TwSh.qilw7y0a

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容