一尘不染

删除切片中的元素

go

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

这个带有 append 函数的删除技巧是如何工作的?

它似乎在第一个元素(空数组)之前抓取所有内容

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

…(点点点)有什么作用?


阅读 176

收藏
2021-11-12

共1个答案

一尘不染

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

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

2021-11-12