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

Go 如何确定可以使用多个值的上下文?

Go 如何确定可以使用多个值的上下文?

Go
犯罪嫌疑人X 2023-06-05 13:23:27
package mainimport "fmt"func multipleRets() (int, int, int, int) {    return 11, 22, 33, 44}func main() {    // Q1    fmt.Println(multipleRets())    // This is fine.    fmt.Println(1, multipleRets()) // But this one errors.    // Q2    s1 := append([]int{}, []int{11, 22, 33, 44}...) // This is fine.    s2 := append([]int{}, multipleRets())           // But this one errors.    // Q3    lit1 := []int{11, 22, 33, 44} // This is fine.    lit2 := []int{multipleRets()} // But this one errors.    // Q4    fmt.Println(1, []int{11, 22, 33, 44})    // This is fine.    fmt.Println(1, []int{11, 22, 33, 44}...) // But this one errors.}上面的源代码中有 4 个错误,所有这些错误都在抱怨不能将多个元素放入函数/文字中。但是考虑到其他示例,我真的找不到将这些错误视为错误的原因。他们不应该没事吗?当 Go 给出类似“单值上下文中的多值”这样的错误时,这意味着什么?这三个有害点的工作方式,这有什么意义?究竟是...做什么的?
查看完整描述

1 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

这就是 Go 设计者避免语法糖的原因;当您期望的糖分比实际的多时,它会导致混淆。你在这里看到 Go 中的两种语法糖;展开切片以传递给可变参数函数,并将多个返回值传递给函数。

此处记录了将切片分解为可变参数函数:

如果最后一个参数可分配给切片类型 []T,如果参数后跟 ...,则它可以作为 ...T 参数的值不变地传递。在这种情况下,不会创建新的切片。

fmt.Println是具有单个可变参数的函数。这意味着您可以将单个项目传递给它,也可以将单个项目传递给已声明的切片并...附加爆炸运算符,在这种情况下,该切片将不加改变地传递。它不能是切片文字,也不能跟随其他参数,以便使用此助手。

作为一种特殊情况,如果函数或方法 g 的返回值在数量上相等并且可单独分配给另一个函数或方法 f 的参数,则调用 f(g(parameters_of_g)) 将在绑定返回值后调用 f g 到 f 的参数的顺序。f 的调用除 g 的调用外不得包含任何参数,并且 g 必须至少有一个返回值。如果 f 有一个 final ... 参数,它会被分配 g 的返回值,这些返回值在分配常规参数后仍然存在。

同样,因为fmt.Println有一个单一的可变参数,您不能混合和匹配传递特定值与使用上述语法糖将多值返回直接传递给另一个函数的参数。

正如 Peter 所说,“Q3 是一个切片文字,它根本不支持可变“参数”(因为值不是参数)。” 上面用于将多个返回值传递给函数的语法糖不适用于切片文字,因为它根本不是函数。


查看完整回答
反对 回复 2023-06-05
  • 1 回答
  • 0 关注
  • 109 浏览
慕课专栏
更多

添加回答

举报

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