第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

Go 中的切片:為什么它允許附加超過容量允許的內(nèi)容?

Go 中的切片:為什么它允許附加超過容量允許的內(nèi)容?

Go
不負相思意 2021-09-13 14:20:36
在 Go中制作 a的容量參數(shù)slice對我來說沒有多大意義。例如,aSlice := make([]int, 2, 2) //a new slice with length and cap both set to 2aSlice = append(aSlice, 1, 2, 3, 4, 5) //append integers 1 through 5fmt.Println("aSlice is: ", aSlice)  //output [0, 0, 1, 2, 3, 4, 5]如果切片允許插入的元素比容量允許的多,為什么我們需要在 make() 函數(shù)中設置它?
查看完整描述

2 回答

?
猛跑小豬

TA貢獻1858條經(jīng)驗 獲得超8個贊

如果內(nèi)置append()函數(shù)有足夠大的容量來容納指定的元素,則內(nèi)置函數(shù)使用指定的切片來追加元素。


但是如果傳遞的切片不夠大,它會分配一個新的、足夠大的切片,將元素從傳遞的切片復制到新切片并將元素附加到新切片。并返回這個新切片。從append()文檔中引用:


append 內(nèi)置函數(shù)將元素附加到切片的末尾。如果它有足夠的容量,目標將被重新切片以容納新元素。如果沒有,將分配一個新的底層數(shù)組。Append 返回更新后的切片。因此有必要將 append 的結果存儲在保存切片本身的變量中:


制作切片時,make如果長度和容量相同,可以省略容量,此時默認為指定長度:


// These 2 declarations are equivalent:

s := make([]int, 2, 2)

s := make([]int, 2)

另請注意,append()在切片的最后一個元素之后追加元素。并且上面的切片len(s) == 2在聲明之后就已經(jīng)有了,所以如果你只向它附加 1 個元素,它會導致重新分配,如本例所示:


s := make([]int, 2, 2)

fmt.Println(s, len(s), cap(s))

s = append(s, 1)

fmt.Println(s, len(s), cap(s))

輸出:


[0 0] 2 2

[0 0 1] 3 4

所以在你的例子中你應該做的是這樣的:


s := make([]int, 0, 10) // Create a slice with length=0 and capacity=10

fmt.Println(s, len(s), cap(s))

s = append(s, 1)

fmt.Println(s, len(s), cap(s))

輸出:


[] 0 10

[1] 1 10


查看完整回答
反對 回復 2021-09-13
?
阿晨1998

TA貢獻2037條經(jīng)驗 獲得超6個贊

它主要是一種優(yōu)化,它不是唯一的,其他語言中的類似結構也有。

當您追加超過容量時,運行時需要為新元素分配更多內(nèi)存。這代價高昂,而且還會導致內(nèi)存碎片。

通過指定容量,運行時預先分配所需的內(nèi)容,并避免重新分配。但是,如果您事先不知道估計容量或它發(fā)生了變化,則不必設置它,運行時會重新分配所需的容量并自行增加容量。


查看完整回答
反對 回復 2021-09-13
  • 2 回答
  • 0 關注
  • 296 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號