2017-07-20 57 views

回答

2

a = append(a[:i], a[i+1:]...) 

ai位置去除該項目時,通過從0的項目組合,以I(不包括)創建一個新的切片,並且從i + 1到最後。

你的第二個問題是...的目的是什麼。 append接受一個片作爲第一個參數,並且不限數量的參數,所有參數的類型都是assignable

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:]...基本上是一個速記語法,轉到規範中https://golang.org/ref/spec#Passing_arguments_to_..._parameters描述:

如果f是可變參數,且類型爲... T的最終參數p,那麼在f內,p的類型等同於類型[] T。如果調用f而沒有實際的p參數,則傳遞給p的值爲零。否則,傳遞的值是類型[] T的新的切片用新的底層數組,其連續元素是實際的參數,其中所有必須可以分配給T

Playground

0

內置FUNC append是可變參數函數。

要通過切片參數傳遞給任何可變參數函數,你必須使用...

轉到郎規格:Passing arguments to ... parameters

如果f是可變參數與最終的參數類型... T,然後內 函數參數等價於類型爲[] T的參數。在 每次調用f,傳遞給最終參數的參數是一個新的 類型爲[] 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

+1

那麼該行正在做的是通過將元素0到i-1與從i + 1開始並繼續到切片結尾的元素連接來創建新切片。換句話說,其效果是從'array'中刪除元素'i'(通過創建一個新的切片;它不會發生)。 –

0

...目的是爲了節省您的append輸入單個元素方法將第一個參數作爲sl冰,然後添加可變數量的元素參數。

即實際上,你需要調用追加爲

append(sliceName[:i], array[i+1], array[i+2], array[i+3], array[i+4])

,但爲了避免打字元素的長列表,你可以簡單地使用切片或陣列後...將其廣泛傳播,將其交給各個元素參數。

1
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] 

goplayground

底層[1,2,3]留在地方,這些數據永遠不會移動到任何地方,而這是由b[i+1][5,6]被附加到[1,2,3] ,並因此被重寫[3,4];另一個[6]呆在原地。

即使您獲得不同的切片副本,底層數組也將是相同的*,這會使得追加更有效的操作,那麼如果必須複製整個底層數組!

*如果底層數組超出容量,則會分配一個新的較大數組,舊數組中的值將被複制到新數組中,但刪除元素時不會發生這種情況。