2017-07-20 21 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]呆在原地。

即使您获得不同的切片副本,底层数组也将是相同的*,这会使得追加更有效的操作,那么如果必须复制整个底层数组!

*如果底层数组超出容量,则会分配一个新的较大数组,旧数组中的值将被复制到新数组中,但删除元素时不会发生这种情况。

相关问题