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 函数的删除技巧是如何工作的?
它似乎在第一个元素(空数组)之前抓取所有内容
然后在第一个元素之后附加所有内容(位置零)
…(点点点)有什么作用?
a切片在哪里,i是要删除的元素的索引:
a
i
a = append(a[:i], a[i+1:]...)
... 是 Go 中可变参数的语法。
...
基本上,在定义一个函数时,它会将您传递的所有参数放入该类型的一个切片中。通过这样做,您可以传递任意数量的参数(例如,fmt.Println可以采用任意数量的参数)。
fmt.Println
现在,当调用一个函数时,...做相反的事情:它解压一个切片并将它们作为单独的参数传递给一个可变参数函数。
那么这条线的作用是:
a = append(a[:0], a[1:]...)
本质上是:
a = append(a[:0], a[1], a[2])
现在,你可能想知道,为什么不直接做
a = append(a[1:]...)
那么,函数定义append是
append
func append(slice []Type, elems ...Type) []Type
所以第一个参数必须是一个正确类型的切片,第二个参数是可变参数,所以我们传入一个空切片,然后解压切片的其余部分来填充参数。