[英]What does the following Go array operation do?
我對以下代碼如何工作感到困惑,尤其是“......”的目的是什么
array = append(array[:i], array[i+1:]...)
這條線
a = append(a[:i], a[i+1:]...)
通過在位置移除所述項目創建一個新的切片i
在a
,由從0的項目組合,以I(不包括在內),和從i + 1到最后。
你的第二個問題是...
的目的是什么。 append
接受一個切片作為第一個參數,以及無限數量的參數,所有參數都具有可分配給其元素類型的類型。
append
定義為
func append(slice []Type, elems ...Type) []Type
寫作
a = append(a[:i], a[i+1:]...)
等同於寫作
a = append(a[:i], a[i+1], a[i+2], a[i+3], a[i+4]) //and so on, until the end of the slice.
使用a[i+1:]...
基本上是一種簡寫語法,因為Go規范在https://golang.org/ref/spec#Passing_arguments_to_..._parameters中描述:
如果f是具有類型... T的最終參數p的可變參數,那么在f中p的類型等同於類型[] T. 如果在沒有p的實際參數的情況下調用f,則傳遞給p的值為nil。 否則,傳遞的值是一個類型為[] T的新切片,其中包含一個新的基礎數組,其連續元素是實際參數,所有這些都必須可賦值給T
array = append(array[:i], array[i+1:]...)
正在刪除索引i
處的元素
但要指出的另一件事是切片由底層數組支持。 例如:
package main
import (
"fmt"
)
func main() {
myArray := [6]int {1,2,3,4,5,6}
mySlice := myArray[:]
fmt.Println("myArray before append: ", myArray)
i := 3
mySlice = append(mySlice[:i], mySlice[i+1:]...)
fmt.Println("mySlice after append: ", mySlice)
fmt.Println("myArray after append: ", myArray)
}
結果:
myArray before append: [1 2 3 4 5 6]
mySlice after append: [1 2 3 5 6]
myArray after append: [1 2 3 5 6 6]
在基礎[1,2,3]
保持不變的情況下,該數據永遠不會移動到任何地方,而由b[i+1]
給出的[5,6]
b[i+1]
被附加到[1,2,3]
,因而覆蓋[3,4]
; 另一個[6]
留在原地。
即使你得到一個切片的不同副本,底層數組也是相同的*,如果必須復制整個底層數組,這會使得附加一個更有效的操作!
*如果底層數組超出了它的容量,將分配一個新的更大的數組,並將舊數組的值復制到新數組,但刪除元素時永遠不會發生這種情況。
內置函數追加是Variadic函數。
要將slice參數傳遞給任何可變參數函數,您必須使用...
Go lang spec: 將參數傳遞給...參數
如果f是具有最終參數類型... T的可變參數,則在函數內該參數等效於類型為[] T的參數。 在f的每次調用中,傳遞給final參數的參數是一個類型為[] T的新切片,其連續元素是實際參數,所有參數必須可分配給類型T.因此切片的長度是綁定到最終參數的參數可能因每個調用站點而異。
此行將為您提供刪除位置i
的結果值。
array = append(array[:i], array[i+1:]...)
讓我們說,我們有
array := []int{1, 2, 3, 4, 5, 6, 7}
i := 3
fmt.Println("Original slice:", array)
part1 := array[:i]
part2 := array[i+1:]
fmt.Println("part1:", part1)
fmt.Println("part2:", part2)
array = append(array[:i], array[i+1:]...)
fmt.Println("Result slice:", array)
輸出:
Original slice: [1 2 3 4 5 6 7]
part1: [1 2 3]
part2: [5 6 7]
Result slice: [1 2 3 5 6 7]
播放鏈接: https : //play.golang.org/p/_cIk0VcD6w
的目的...
是保存在鍵入各個元素作為append
方法采用第一參數作為切片和參數然后可變數量的元件要追加。
即你實際上需要調用追加為
append(sliceName[:i], array[i+1], array[i+2], array[i+3], array[i+4])
但是為了避免鍵入長元素列表,您可以簡單地在切片或數組之后使用...
將其作為單個元素進行傳播以作為參數傳遞。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.