Golang支持将多个返回值分配给多个左手侧变量。例如:
func test() (string, string) {
return "1", "1"
}
a, b := test()或
a, _ := test()接收变量和返回值的数量必须匹配:
b = test() //wrong但是对于一些内置类型,如[]或<-,则支持可变数量的返回值。
key, exist := map[key]
key := map[key]我可以从这样的频道读取值
c <- myChan
c, exist <- myChan我们如何解释这种不一致?这是为核心go运行时/语言保留的功能吗?
发布于 2017-09-18 04:48:28
此行为在金刚规格中明确指定。
用于特殊表单的赋值或初始化的接收表达式。
x, ok = <-ch
x, ok := <-ch
var x, ok = <-ch
var x, ok T = <-ch生成一个额外的非类型布尔值结果,报告通信是否成功。如果通过成功的发送操作将接收到的值传递到通道,则ok的值为true;如果由于通道关闭和空,产生的值为零,则为false。
mapKV类型的映射a上的索引表达式,用于特殊窗体的赋值或初始化
v, ok = a[x]
v, ok := a[x]
var v, ok = a[x]
var v, ok T = a[x]生成一个额外的非类型布尔值。如果映射中存在x键,则ok的值为true,否则为false。
元组赋值将多值操作的各个元素分配给变量列表。有两种形式。在第一个操作数中,右手操作数是一个多值表达式,例如函数调用、通道或映射操作或类型断言。左手边的操作数必须与值的数目相匹配。例如,如果f是一个返回两个值的函数,
x, y = f()将第一个值分配给x,第二个赋值给y。在第二种形式中,左边的操作数必须等于右边表达式的数目,每个表达式必须是单值的,右边的第n个表达式分配给左边的第n个操作数。
因此,正如您可以看到的那样,这种行为是由语言设计指定的,并且您无法自己实现为Receive operator和Index expression指定的行为。
发布于 2017-09-18 04:40:42
您正在混淆从函数返回的多个值和所谓的“逗号ok”成语。
对于函数的返回值,您必须要么处理所有这些值,要么不处理它们。很简单。
“逗号”是比较微妙的。通常,如果指定了第二个值,则会更改行为。请考虑以下发言:
v, ok := x.(int)
// vs
v := x.(int)如果x是一个包含整数的接口,那么一切都很好,但是,如果x持有不同的类型,那么第一条语句就能工作(返回0, false),第二条语句就会恐慌。
每种带有“逗号ok”形式的语句都是不同的特例,它们与其他类型的多个赋值(例如多个函数返回值)不一样。你不能比较它们,每一种都是它自己的东西,和它自己的规则。
https://stackoverflow.com/questions/46271620
复制相似问题