删除切片中的元素

新手上路,请多包涵
func main() {
    a := []string{"Hello1", "Hello2", "Hello3"}
    fmt.Println(a)
    // [Hello1 Hello2 Hello3]
    a = append(a[:0], a[1:]...)
    fmt.Println(a)
    // [Hello2 Hello3]
}

这个带有附加功能的删除技巧是如何工作的?

它似乎在第一个元素(空数组)之前抓住了一切

然后在第一个元素(位置零)之后附加所有内容

…(点点点)的作用是什么?

原文由 Jorge Olivero 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 706
2 个回答

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

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

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

基本上,当 定义 一个函数时,它会将您传递的所有参数放入该类型的一个切片中。通过这样做,您可以根据需要传递任意数量的参数(例如, fmt.Println 可以采用任意数量的参数)。

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

那么这条线做了什么:

 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

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

原文由 dave 发布,翻译遵循 CC BY-SA 4.0 许可协议

有两种选择:

A:你关心保留数组顺序:

 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. CAREFUL only works if you have enough elements.
a = a[:len(a)-1]   // Chop off the last one.

如果您的数组是指针,请参阅链接以了解内存泄漏的影响。

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

原文由 Chris 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题