【slice】注意事項(xiàng)

實(shí)驗(yàn)一:
我們都知道,數(shù)組聲明以后,數(shù)組的地址和數(shù)組內(nèi)元素的地址是固定的。
而slice則不然,如果修改slice1的元素的值,而不進(jìn)行append操作,那么slice1[0]的地址會(huì)改變嗎?

image.png

image.png

也就是說(shuō),修改slice的元素的值,元素的地址不變。那么,我們來(lái)看看append函數(shù)到底干了什么事兒。首先追溯append()函數(shù),然而在builtin.go中,只有

// The append built-in function appends elements to the end of a slice. If
// it has sufficient capacity, the destination is resliced to accommodate the
// new elements. If it does not, a new underlying array will be allocated.
// Append returns the updated slice. It is therefore necessary to store the
// result of append, often in the variable holding the slice itself:
//  slice = append(slice, elem1, elem2)
//  slice = append(slice, anotherSlice...)
// As a special case, it is legal to append a string to a byte slice, like this:
//  slice = append([]byte("hello "), "world"...)
func append(slice []Type, elems ...Type) []Type

代碼追溯看不到實(shí)現(xiàn),在調(diào)試運(yùn)行中,發(fā)現(xiàn)跳轉(zhuǎn)到src\runtime\slice.go的growslice函數(shù),打開(kāi)src\runtime\slice.go,

type slice struct {
    array unsafe.Pointer
    len   int
    cap   int
}
//略...
func growslice(et *_type, old slice, cap int) slice {
//略...
    newcap := old.cap
    doublecap := newcap + newcap
    if cap > doublecap {
        newcap = cap
    } else {
        if old.len < 1024 {
            newcap = doublecap
        } else {
            for newcap < cap {
                newcap += newcap / 4
            }
        }
    }
//略...
    var p unsafe.Pointer
//略...
    return slice{p, old.len, newcap}
}

由此可見(jiàn),在growslice中,是聲明并且初始化了一個(gè)新的slice結(jié)構(gòu)體,并且賦值了一個(gè)新的unsafe.Pointer地址,原來(lái)slice的長(zhǎng)度和一個(gè)新的容量newcap,所以地址必然改變!

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

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

  • 【早起】05:00 【睡覺(jué)】23:00看了一會(huì)春晚,晚了點(diǎn) 【學(xué)習(xí)】誦讀《黃帝內(nèi)經(jīng)》素問(wèn)19-20章。 【鍛煉】掄...
    真泥閱讀 591評(píng)論 1 4
  • 又是一年春節(jié)到,時(shí)間過(guò)的真快,這一年,禪繞對(duì)我不離不棄,我愛(ài)上這種魔術(shù)一樣的畫(huà)圖方式,享受它帶給我的快樂(lè)。 很多時(shí)...
    阿甘的蝸牛屋閱讀 439評(píng)論 1 2
  • 總體總結(jié) 本周是春節(jié)放假的一周,本周任務(wù)完成的都特別好,我給自己打9分。項(xiàng)目開(kāi)盤(pán)情況我的工作情況獲得了甲方的認(rèn)可,...
    羽青閱讀 241評(píng)論 0 1
  • 重走長(zhǎng)征路 暖冬萬(wàn)里行 第45天 霜天冰地 地瘠人寒 又見(jiàn)“小紅籽兒”,霜打的小紅籽兒依然紅亮鮮艷…… 早上在桃花...
    寒冰0601閱讀 239評(píng)論 0 0
  • 跑步是宣泄,是放松,是忘記一切。 拋開(kāi)雜念,跑步就是跑步。 還等什么,開(kāi)始吧! 熱情不能陪你到終點(diǎn)。 做好每個(gè)拉伸...
    白語(yǔ)金言閱讀 262評(píng)論 0 2

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