删除切片中的元素

func main() { a := []string{"Hello1", "Hello2", "Hello3"} fmt.Println(a) // [Hello1 Hello2 Hello3] a = append(a[:0], a[1:]...) fmt.Println(a) // [Hello2 Hello3] } 

如何删除与追加function的伎俩?

看起来,它抓住了第一个元素(空数组)之前的所有东西,

然后在第一个元素(位置零)

(点点)做什么?

其中a是切片,而i是要删除的元素的索引:

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

...是Go中可变参数的语法。

基本上,当定义一个函数的时候,它把你传递的所有参数放到这个types的一个片段中。 通过这样做,您可以根据需要传递尽可能多的参数(例如, fmt.Println可以根据需要采用fmt.Println参数)。

现在,当调用一个函数时, ...做相反的事情:它将解包一个片段并将它们作为单独的parameter passing给一个可变参数函数。

那么这条线是做什么的:

 a = append(a[:0], a[1:]...) 

基本上是:

 a = append(a[:0], a[1], a[2]) 

现在,你可能想知道,为什么不做呢

 a = append(a[:1]...) 

那么, append的函数定义是

 func append(slice []Type, elems ...Type) []Type 

所以第一个参数必须是正确types的一个分片,第二个参数是可变参数,所以我们传入一个空的分片,然后解压其余的分片来填充参数。

有两个选项:

– 答:你在乎保留数组顺序:

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

B:你不关心维持秩序(这可能更快):

 a[i] = a[len(a)-1] // Replace it with the last one. a = a[:len(a)-1] // Chop off the last one. 

如果您的数组是指针,请参阅链接以查看有关内存泄漏的含义。

https://github.com/golang/go/wiki/SliceTricks

…是可变参数的语法。

我认为它是由编译器使用slice( []Type) ,就像函数append:

 func append(slice []Type, elems ...Type) []Type 

当在“追加”中使用“elems”时,实际上它是一个切片([]types)。 所以“ a = append(a[:0], a[1:]...) ”的意思是“ a = append(a[0:0], a[1:])

a[0:0]是一个没有任何内容的片段

a[1:]是“Hello2 Hello3”

这是如何工作的

或者,因为您正在尝试查找要删除的元素的索引,

 // na = new a, da = a that's to be deleted var na []string for _, v := range a { if v == da { continue } else { na = append(na, v) } } a = na 

好吧,那算了。 对于这个话题是正确的答案,但对于问题主体来说是错误的答案