紧接切片后...是什么意思?

问题描述 投票:0回答:2

在 Go 中,

...
是什么意思?

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

我读过这篇精彩的问答: 三个点(称为通配符?)是否包含多种含义?

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

go slice ellipsis
2个回答
21
投票

某些语言(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 决定将其限制为指定的情况:您传递给定类型的切片

这很好,因为它让类型系统做它的事情,同时仍然非常灵活(特别是,所讨论的类型可以是一个接口,因此只要函数知道如何传递不同的“实际类型”处理这些。

典型的例子是命令函数,它执行一个程序,并传递给它一些参数

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

函数尽管是内置且特殊的,但

遵循相同的规则
。您可以将零个、一个或多个元素附加到切片。如果您想连接切片(即您已经有一个“参数切片”),您同样可以使用省略号使其直接使用它。


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

© www.soinside.com 2019 - 2024. All rights reserved.