最近在看golang的時(shí)候發(fā)現(xiàn)golang的map類型的元素比較特殊,也就是不能夠取地址。因?yàn)閙ap實(shí)際上是一張hash表,當(dāng)map元素?cái)?shù)量增加的時(shí)候,當(dāng)前分配的內(nèi)存不足以存放新的數(shù)據(jù),就會(huì)重新分配更大的內(nèi)存空間,并把原有的數(shù)據(jù)遷移過(guò)來(lái)。因此以前的地址保存的就不是當(dāng)前map中的元素了。
思考了一下,slice應(yīng)該也是類似的但是slice是允許取地址操作的,因此做了一個(gè)小驗(yàn)證:
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]
強(qiáng)制定義一個(gè)cap為1的slice,并放入一個(gè)"a",然后使用a變量保存這個(gè)地址,更改a變量指向的值,發(fā)現(xiàn)slice確實(shí)也跟著變了,這是因?yàn)橹皇切薷膕lice的元素,沒(méi)有發(fā)生slice的增容,因此slice元素的值和a變量指向的是同一個(gè)值。
第二段代碼唯一的區(qū)別就是在a變量指向slice的第一個(gè)值后,強(qiáng)制增容了slice,導(dǎo)致slice重新分配內(nèi)存空間,這個(gè)時(shí)候修改a變量指向的值,slice并沒(méi)有變化,意味著這個(gè)時(shí)候a變量和slice的第一個(gè)元素已經(jīng)不是指向同一個(gè)變量了。
阿里云雙十一云服務(wù)器拼團(tuán)活動(dòng),已經(jīng)打到最低價(jià)99元一年!有需要的可以考慮一波了!
https://m.aliyun.com/act/team1111/#/share?params=N.9g4CZ2TwSh.qilw7y0a