最近在看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