3 回答

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超3個(gè)贊
使用append()內(nèi)置
例子:
type mytype struct {
a, b int
}
func main() {
a := []mytype{mytype{1, 2}, mytype{3, 4}}
a = append(a, mytype{5, 6})
}

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超2個(gè)贊
Go Slice包含三個(gè)元素:數(shù)據(jù),長(zhǎng)度和容量。
s := make([]int, 0, 10)
變量s是一個(gè)整數(shù)切片,其長(zhǎng)度為0,容量為10。內(nèi)置的len()和cap()函數(shù)允許您獲取切片的長(zhǎng)度和容量:
len(s) == 0
cap(s) == 10
要增加切片的長(zhǎng)度,只需重新切片:
s = s[0:5]
// len(s) == 5
// cap(s) == 10
要減少長(zhǎng)度,可以采用子切片:
s = s[0:1]
// len(s) == 1
有一些較短的方法可以調(diào)用make():
a := make([]int, 10)
// len(a) == cap(a) == 10
b := make([]int)
// len(b) == cap(b) == 0
一切都很好,但是如果您需要將切片的長(zhǎng)度增加到超出其容量,該怎么辦?為此,您需要分配一個(gè)新的片并將舊片的內(nèi)容復(fù)制到新的片上。(函數(shù)“ copy”是另一個(gè)內(nèi)置函數(shù)。)
t := make([]int, len(s), 20)
copy(t, s)
在有效圍棋文檔需要這個(gè)例子有點(diǎn)進(jìn)一步,實(shí)現(xiàn)一個(gè)附加功能追加一個(gè)切片到另一個(gè),調(diào)整其大小,如果必要的。
切片由數(shù)組支持;當(dāng)make()一片特定容量的切片時(shí),該容量的數(shù)組將在后臺(tái)分配。切片實(shí)際上成為該數(shù)組的“智能指針”。如果將該切片(或該切片的子切片)傳遞給另一個(gè)函數(shù),則它將作為指向同一數(shù)組的指針傳遞。這使得子切片的創(chuàng)建非常便宜-昂貴的是后備陣列的分配。
Go標(biāo)準(zhǔn)庫(kù)包含許多容器軟件包(例如vector),從而無(wú)需手動(dòng)管理切片。使用切片可以提高速度,而使用更精細(xì)的容器類可以更加方便。(也就是說(shuō),大多數(shù)情況下我仍然使用切片。)
您可能想知道為什么需要處理所有這些麻煩。畢竟,許多語(yǔ)言都提供動(dòng)態(tài)調(diào)整大小的數(shù)組作為基元。這樣做的原因與Go的哲學(xué)息息相關(guān)。語(yǔ)言設(shè)計(jì)人員不會(huì)假定您知道適合您的程序的分配策略是什么;相反,它們?yōu)槟峁┝藰?gòu)建自己的數(shù)據(jù)結(jié)構(gòu)所需的工具。
- 3 回答
- 0 關(guān)注
- 446 瀏覽
添加回答
舉報(bào)