回答
线
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. 我在做下面的数组操作时做错了什么?
- 2. 我是什么与阵列做错了
- 3. '+ ='操作符在Javascript中做了什么?
- 4. 内存操作 - 我做错了什么?
- 5. '|| ='操作符在ruby中做了什么?
- 6. PHP流上下文在文件操作方面做了什么?
- 7. 冒号操作符在这种情况下做了什么?
- 8. 以下声明做了什么?
- 9. go-pear.php有什么用?它实际上做了什么?
- 10. 在C#/ Java中有什么类似的做以下操作?
- 11. ls -LA做什么操作?
- 12. 为什么以下定义了一个演员操作符?
- 13. 阵列在矢量不工作时工作。我究竟做错了什么?
- 14. 以下命令做什么?
- 15. 击:我怎么可以做以下操作在bash
- 16. 阵列操作
- 17. 阵列操作
- 18. 阵列操作
- 19. 什么是Ext.Component.initialConfig,它做了什么,以及在什么情况下使用它?
- 20. 我在这个JavaScript循环操作中做了什么错误?
- 21. malloc和free的内存操作到底做了什么?
- 22. att汇编操作[sub(%eax),edx]实际上做了什么?
- 23. 这个操作在C++中做了什么:char c&= 0x5F?
- 24. Elixir中的Circumflex标志/ Pin/Cap操作符(^)做了什么?
- 25. 这位或者操作符在JavaScript中做了些什么?
- 26. 这个操作符在ruby中做了些什么? << =
- 27. 在Meteor/MongoDB中操作数据时,我做错了什么?
- 28. 如何用C做以下操作?
- 29. GO命令在SQL脚本中做了什么?
- 30. 下面的.forEach语句做了什么?
那么该行正在做的是通过将元素0到i-1与从i + 1开始并继续到切片结尾的元素连接来创建新切片。换句话说,其效果是从'array'中删除元素'i'(通过创建一个新的切片;它不会发生)。 –