簡體   English   中英

以下Go數組操作有什么作用?

[英]What does the following Go array operation do?

我對以下代碼如何工作感到困惑,尤其是“......”的目的是什么

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

這條線

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

通過在位置移除所述項目創建一個新的切片ia ,由從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]

goplayground

在基礎[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM