......切片后直接来的意思是什么?

时间:2016-06-01 13:49:13

标签: go

在这种情况下,...在Go中意味着什么?

ids = append(ids[:index], ids[index+1:]...)

我读过这个很棒的Q& A: Do three dots (which is called wildcard?) contain multiple meanings?

关于什么......在某些情况下意味着什么,但我不明白在上述情况下它意味着什么。

2 个答案:

答案 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])