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

Go如何确定可以使用多个值的上下文?,go,types,error-handling,return-value,multiple-return-values,Go,Types,Error Handling,Return Value,Multiple Return Values,上面的源代码中有4个错误,它们都抱怨不能在一个函数/文本中放入多个元素 但是,考虑到其他例子,我真的找不到将这些错误视为错误的理由 他们不应该很好吗?当Go给出“单值上下文中的多值”这样的错误时,这意味着什么 这三个有害的点是如何工作的,这有什么意义?…到底做了什么?这就是为什么围棋设计师避免使用语法糖分的原因;当你期望的糖比实际的多时,这会导致混乱。你在Go-here中看到了两种句法上的糖分;分解切片以传递给可变函数,并将多个返回值传递给函数 此处记录了将切片分解为可变函数的过程:关键细节如下

上面的源代码中有4个错误,它们都抱怨不能在一个函数/文本中放入多个元素

但是,考虑到其他例子,我真的找不到将这些错误视为错误的理由

他们不应该很好吗?当Go给出“单值上下文中的多值”这样的错误时,这意味着什么


这三个有害的点是如何工作的,这有什么意义?
到底做了什么?

这就是为什么围棋设计师避免使用语法糖分的原因;当你期望的糖比实际的多时,这会导致混乱。你在Go-here中看到了两种句法上的糖分;分解切片以传递给可变函数,并将多个返回值传递给函数

此处记录了将切片分解为可变函数的过程:关键细节如下:

如果最后一个参数可分配给切片类型[]T,则如果该参数后面跟有…,则可以将其作为…T参数的值原封不动地传递。。。。在这种情况下,不会创建新切片

fmt.Println
是一个具有单个可变参数的函数。这意味着您可以传递单个项目,也可以传递附加了
..
爆炸运算符的声明切片的单个项目,在这种情况下,该切片的传递将保持不变。它不能是切片文字,也不能跟随其他参数,以利用此帮助器

另一个记录如下:具体而言:

作为一种特殊情况,如果一个函数或方法g的返回值在数量上相等,并且可以单独分配给另一个函数或方法f的参数,那么调用f(g(parameters_of_g))将在按顺序将g的返回值绑定到f的参数后调用f。f的调用必须不包含除g的调用以外的任何参数,并且g必须至少有一个返回值。如果f有一个最终的。。。参数,则为其分配在分配常规参数后保留的g的返回值

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


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

您应该从开始。这只是遵循语言规范。请阅读它。如果你问“为什么会这样,而不是我期望的那样”:那就是Ott语言规范是以一种非常正式的风格编写的,所以它不是最容易阅读的东西,但它非常简短。像Java、C#和Ruby这样的语言规范的长度是5到10倍甚至更多。Q3是一种切片文字,不支持变量“参数”(因为值不是参数)。事实上,为了清楚起见,在答案中添加了“参数”。
package main

import "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.
}