当前位置: 首页 > 面试题库 >

在可变函数中混合“爆炸”的切片和常规参数

何向荣
2023-03-14
问题内容

我想知道为什么无法进行以下操作:

func main() {
    stuff := []string{"baz", "bla"}
    foo("bar", stuff...)
}

func foo(s ...string) {
    fmt.Println(s)
}

以我的理解,slice …“爆炸”切​​片,因此可以将其用于多参数函数调用。因此,上述示例实际上应扩展为foo("bar", "baz", "bla")

foo(stuff...) 可以正常工作,在这里并不奇怪,但是在上面的示例中,编译器抱怨参数过多。

这是理想的限制吗?我来自一个foo("bar", *stuff)很好的红宝石背景(至少在我的书中也是一样),这就是为什么这让我感到惊讶。


问题答案:

可变参数的值 可以 通过枚举元素来指定, 也可以 使用现有切片(由其名称后跟来指定)来指定...

您想混合Go语言规范不允许的2种可能方式(将...参数传递给parameter)。

如果使用第一种形式(枚举元素):

传递的值(作为可变参数)是具有新的[]T基础数组的类型的新切片,其后续元素是实际参数

如果使用后者(传递现有切片,然后传递...),则 不会创建新的切片 ,则传递的 切片将照 原样使用。而通过分片只能用于指定的值
一个 -在 最后 -可变参数的参数。尝试同时传递单个元素 切片将不匹配函数的签名(在这种情况下为参数列表),并且会出现错误:

too many arguments in call to foo

Go中没有实际的“爆炸”,该术语仅在其他语言中用于帮助可视化传递的数组或切片将不是可变参数的 元素 ,而是可变参数 本身 的值。

混合使用2将需要分配新的片,因为显然无法使用现有的片。



 类似资料:
  • 我需要在 Mockito 中验证一个具有多个参数的方法,但只需要捕获一个参数,其他参数我只需要一个简单的匹配器。这可能吗? 例如,如果我有: 在这种情况下,我是否需要为每个参数编写一个捕获器,尽管我只需要捕获第一个参数?

  • 问题内容: 我想从包含单词列表的DataFrame转换为每个单词都在其自己行中的DataFrame。 如何在DataFrame中的列上爆炸? 这是我尝试的一些示例,您可以在其中取消注释每个代码行并获取以下注释中列出的错误。我在带有Spark 1.6.1的Python 2.7中使用PySpark。 请指教 问题答案: 和是SQL函数。两者都在SQL上运行。将Java正则表达式作为第二个参数。如果要在

  • 描述 (Description) &可以在逗号分隔的列表中生成所有可能的选择器排列。 例子 (Example) 以下示例演示了如何使用&生成LESS文件中所有可能的选择器排列 - <html> <head> <link rel = "stylesheet" href = "style.css" type = "text/css" /> <title>Combinato

  • 问题内容: 我有一个包含JSON对象的表。每个JSON对象在方括号中均包含一个数组,并用逗号分隔。 如何使用SQL访问方括号数组中的任何元素,例如“ Matt”? 我在Hadoop上使用“ Hive”。如果您知道如何在SQL中执行此操作,那很好:) 问题答案: 您可以在Hive中执行以下操作: 首先,您需要一个JSON SerDe(Serializer / Deserializer)。我见过的最实

  • 受这个答案的启发,我生成了这段代码,其输出取决于编译器: 如果使用 GCC 11 编译,调用

  • 问题内容: 如标题所示,我需要知道方法参数中是否存在与java对应的语法,例如 (代码由维基百科提供) 问题答案: 是的,您可以这样写: