回答
線
a = append(a[:i], a[i+1:]...)
在a
在i
位置去除該項目時,通過從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
內置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]
的...
目的是爲了節省您的append
輸入單個元素方法將第一個參數作爲sl冰,然後添加可變數量的元素參數。
即實際上,你需要調用追加爲
append(sliceName[:i], array[i+1], array[i+2], array[i+3], array[i+4])
,但爲了避免打字元素的長列表,你可以簡單地使用切片或陣列後...
將其廣泛傳播,將其交給各個元素參數。
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]
被附加到[1,2,3]
,並因此被重寫[3,4]
;另一個[6]
呆在原地。
即使您獲得不同的切片副本,底層數組也將是相同的*,這會使得追加更有效的操作,那麼如果必須複製整個底層數組!
*如果底層數組超出容量,則會分配一個新的較大數組,舊數組中的值將被複制到新數組中,但刪除元素時不會發生這種情況。
- 1. '|| ='操作符在ruby中做了什麼?
- 2. PHP流上下文在文件操作方面做了什麼?
- 3. 冒號操作符在這種情況下做了什麼?
- 4. 以下聲明做了什麼?
- 5. go-pear.php有什麼用?它實際上做了什麼?
- 6. ls -LA做什麼操作?
- 7. 以下命令做什麼?
- 8. 擊:我怎麼可以做以下操作在bash
- 9. 陣列操作
- 10. 陣列操作
- 11. 什麼是Ext.Component.initialConfig,它做了什麼,以及在什麼情況下使用它?
- 12. 如何用C做以下操作?
- 13. Elixir中的Circumflex標誌/ Pin/Cap操作符(^)做了什麼?
- 14. 這位或者操作符在JavaScript中做了些什麼?
- 15. 在vim ex模式下,@%做了什麼?
- 16. logging.basicConfig做了什麼?
- 17. class_initialize()做了什麼?
- 18. @synchronized()做了什麼?
- 19. 什麼做錯了?
- 20. `tf.strided_slice()`做了什麼?
- 21. L做了什麼?
- 22. :操作員在裝配中做什麼?
- 23. 這個位操作函數做什麼?
- 24. 簡單操作在Matlab中做什麼?
- 25. 操作主陣列
- 26. 陣列RGB操作
- 27. 多陣列操作
- 28. Javascript陣列操作
- 29. 以下函數在Scheme編程語言中做了什麼
- 30. 以下表單在代碼中做了什麼?
那麼該行正在做的是通過將元素0到i-1與從i + 1開始並繼續到切片結尾的元素連接來創建新切片。換句話說,其效果是從'array'中刪除元素'i'(通過創建一個新的切片;它不會發生)。 –