在这种情况下,...
在Go中意味着什么?
ids = append(ids[:index], ids[index+1:]...)
我读过这个很棒的Q& A: Do three dots (which is called wildcard?) contain multiple meanings?
关于什么......在某些情况下意味着什么,但我不明白在上述情况下它意味着什么。
答案 0 :(得分:5)
某些语言(C,Python,...)接受可变参数。基本上,您允许函数的客户端传递一个参数,而不指定多少个。由于函数仍然需要以某种方式处理这些参数,因此它们通常会转换为某种类型的集合。例如,在Python中:
def foo(x, *args): # * is used for variadic arguments
return len(args)
>>> foo(1) # Passed the required argument, but no varargs
0
>>> foo(1, 2, 3) # Passed the required, plus two variadic arguments
2
>>> foo(1, 2, 3, 4, 5, 6) # required + 5 args, etc...
5
现在,这种方法的一个明显问题是,就类型而言,许多参数是一个非常模糊的概念。 C使用指针,Python并不真正关心类型,并且Go决定将其限制为指定的大小写:传递a slice of a given type。
这很好,因为它允许类型系统做它的事情,同时仍然非常灵活(特别是,有问题的类型可以是一个接口,所以你可以传递不同的'实际类型',只要函数知道如何处理这些。
典型的例子是Command function,它执行一个程序,传递它一些参数:
func Command(name string, arg ...string) *Cmd
这里有很多意义,但请记住,可变参数只是一种传递切片的方便方法。您可以使用完全相同的API:
func Command(name string, args []string) *Cmd
第一个的唯一优点是它允许你不传递任何参数,一个参数,几个......而不必自己构建切片。
有时候,你做有一个切片,但需要调用一个可变参数函数。但如果你天真地这样做:
my_args_slice := []string{"foo", "bar"}
cmd := Command("myprogram", my_args_slice)
编译器会抱怨它需要字符串,但却得到了一个切片!你要告诉它的是它不必“在后面构建切片”,因为你已经有了一个切片。你可以使用这个省略号来做到这一点:
my_args_slice := []string{"foo", "bar"}
cmd := Command("myprogram", my_args_slice...) // <- Interpret that as strings
append
函数,尽管内置且特殊,follows the same rules。您可以将零个,一个或多个元素附加到切片。如果你想连接切片(即你已经有一个'参数片'),你可以类似地使用省略号使它直接使用它。
答案 1 :(得分:2)
解包切片。
ids[:index]
是ids[0:index]
ids[index+1:]
是ids[index+1:len(ids)-1]
因此,您的示例ids = append(ids[:index], ids[index+1:]...)
会转换为
//pseudocode
ids = append(ids[0:index], ids[index+1], ids[index+2], ids[index+3], ..., ids[len(ids)-2], ids[len(ids)-1])