为了账号安全,请及时绑定邮箱和手机立即绑定

是什么意思时直接在切片后?

是什么意思时直接在切片后?

Go
qq_花开花谢_0 2022-01-17 10:26:51
在这种情况下,Go 中的含义是什么...?ids = append(ids[:index], ids[index+1:]...)关于什么......在某些情况下意味着什么,但我不明白在上述情况下它意味着什么。
查看完整描述

2 回答

?
慕沐林林

TA贡献2016条经验 获得超9个赞

某些语言(C、Python、...)接受可变参数。基本上,您允许函数的客户端传递多个参数,而无需指定多少。由于该函数仍需要以一种或另一种方式处理这些参数,因此它们通常被转换为某种集合。例如,在 Python 中:


def foo(x, *args): # * is used for variadic arguments

    return len(args)


>>> foo(1)  # Passed the required argument, but no varargs

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

这在这里很有意义,但请记住,可变参数只是传递 slices 的一种便捷方式。您可以拥有完全相同的 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函数尽管是内置的和特殊的,但遵循相同的规则。您可以将零个、一个或多个元素附加到切片。如果您想连接切片(即您已经有一个“参数切片”),您同样可以使用省略号使其直接使用它。


查看完整回答
反对 回复 2022-01-17
?
当年话下

TA贡献1890条经验 获得超9个赞

它解包切片。

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



查看完整回答
反对 回复 2022-01-17
  • 2 回答
  • 0 关注
  • 114 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信