上述代碼中一個有趣的問題是:append返回的是什嗎?第一種情況:當 len(x) == cap(x)(切片長度等於切片容量)時,將建立一個新的數組,並返回一個新的切片引用。第二種情況:切片長度為0,但容量為4,不會建立一個新的的數組。
(譯者註:原文中第二種情況為:In the second case, where len(x) == 4 but cap(x) == 0 是錯的。在Go中 len(x) <= cap(x)) 理解了嗎?讓我們再做個測試,下列代碼的輸出是什麼: original := []int{1,2,3,4} //a slice with a len and cap of 4other := originalother[2] = 8fmt.Println(original)fmt.Println(other)other = append(original, 5)other[2] = 9fmt.Println(original)fmt.Println(other)第一段代碼的輸出是: [1, 2, 8, 4]。第二段代碼的輸出是: [1, 2, 8, 4]和[1, 2, 9, 4, 5]。與第一段輸出不同,是因為:append操作需要增加底層數組的長度,所以other被指定到一個新的切片上,而original沒變。 基於這些認知,我們可以我們自己的基於切片和數組的,有更高控制力的,類似append的插入函數了。我們的函數可以處理兩種情況:已達到最大容量(需要增加底層數組長度)、未達到最大容量。首先,我們看看達到最大容量時,如何處理: func insert(original []int, position int, value int) []int { l := len(original) var target []int if cap(original) == l { target = make([]int, l+1, l+10) copy(target, original[:position]) target[position] = value copy(target[position+1:], original[position:]) } else { // todo } return target} |
caotj72 翻譯於 2個月前 0人頂 頂 翻譯的不錯哦! |