亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在保留其子切片的同時生長切片

在保留其子切片的同時生長切片

Go
開心每一天1111 2022-01-10 17:07:58
我一直在嘗試切片。這是一個示例程序for n := 1; n <= 10; n++ {    a := make([]int, 0)    for j := 0; j < n; j++ {        a = append(a, 0)    }    b := a[:1]    a = append(a, 0)    a[0] = 1    fmt.Println(n, b[0])}輸出是1 02 03 14 05 16 17 18 09 110 1我明白這里發生了什么。a = append(a, 0)如果舊數組的長度不足,則該行分配一個新數組,并且新數組的長度是原始數組的兩倍。因此,如果n是 2 的冪,則這條線a[0] = 1不會更改所支持的數組,b因為新數組將在之前的行中分配。但是,我在文檔中找不到明確聲明新分配的數組始終具有兩倍的長度。這是否意味著我的代碼依賴于實現?以這種方式將另一個切片的切片存儲在變量中是不好的做法,還是應該a[j:k]每次需要子切片時都這樣做?
查看完整描述

2 回答

?
慕碼人2483693

TA貢獻1860條經驗 獲得超9個贊

底層數組的大小加倍是一個實現細節(在當前實現中,一旦大小達到某個閾值,就不再是這樣了)。所以你不能依靠這個來選擇性地改變b[0]或不改變。

不幸的是,我不明白你的最后兩個問題。分片沒有任何問題,它不依賴于顯式 ( a[i:k]) 或隱式開始或停止索引 (a[i:]a[:k]),因為這是完全相同的。


查看完整回答
反對 回復 2022-01-10
?
慕標琳琳

TA貢獻1830條經驗 獲得超9個贊

你已經知道答案了。

  • 它依賴于實現

  • 如果要更改底層數組/切片,則將切片子切片為 var 是不好的做法

  • 您最好在需要時明確使用子切片 - 它很便宜。

不過是個好問題。感謝分享。


查看完整回答
反對 回復 2022-01-10
  • 2 回答
  • 0 關注
  • 155 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號