如何理解golang多重返回值

如何理解golang多重返回值,go,return-value,Go,Return Value,Golang支持为多个左侧变量分配多个返回值。例如: func test() (string, string) { return "1", "1" } a, b := test() 或 接收变量和返回值的数量必须匹配: b = test() //wrong 但对于某些内置类型,例如[]或,您将从函数返回的多个值与所谓的逗号ok习惯用法混淆 对于函数的返回值,必须处理所有返回值,或者不处理任何返回值。简单 逗号ok更微妙。如果指定了第二个值,则通常会更改行为。考虑这些陈述: v, o

Golang支持为多个左侧变量分配多个返回值。例如:

func test() (string, string) {
  return "1", "1"
}

a, b := test()

接收变量和返回值的数量必须匹配:

b = test()   //wrong

但对于某些内置类型,例如[]或,您将从函数返回的多个值与所谓的逗号ok习惯用法混淆

对于函数的返回值,必须处理所有返回值,或者不处理任何返回值。简单

逗号ok更微妙。如果指定了第二个值,则通常会更改行为。考虑这些陈述:

v, ok := x.(int)
// vs
v := x.(int)
如果x是一个包含整数的接口,一切正常,但是,如果x包含不同的类型,第一条语句将返回0,false,第二条语句将死机


每种带有逗号ok形式的语句都是不同的特例,它们与其他类型的多重赋值(如多个函数返回值)不同。您无法将它们进行比较,每一个都有自己的规则。

您将一个函数返回的多个值与所谓的逗号ok习惯用法相混淆

对于函数的返回值,必须处理所有返回值,或者不处理任何返回值。简单

逗号ok更微妙。如果指定了第二个值,则通常会更改行为。考虑这些陈述:

v, ok := x.(int)
// vs
v := x.(int)
如果x是一个包含整数的接口,一切正常,但是,如果x包含不同的类型,第一条语句将返回0,false,第二条语句将死机


每种带有逗号ok形式的语句都是不同的特例,它们与其他类型的多重赋值(如多个函数返回值)不同。你不能将它们进行比较,每一个都是自己的东西,都有自己的规则。

这一行为在:

在特殊窗体的赋值或初始化中使用的接收表达式

生成一个额外的非类型化布尔值。如果映射中存在键x,则ok的值为true,否则为false

元组分配将多值操作的各个元素分配给变量列表。有两种形式。在第一种情况下,右操作数是单个多值表达式,例如函数调用、通道或映射操作或类型断言。左侧的操作数必须与值的数目匹配。例如,如果f是一个返回两个值的函数

将第一个值指定给x,第二个值指定给y。在第二种形式中,左边的操作数必须等于右边的表达式数,每个表达式都必须是单值的,右边的第n个表达式被赋给左边的第n个操作数


因此,正如您所看到的,这种行为是由语言设计指定的,您自己无法实现为接收运算符和索引表达式指定的行为。

此行为在:

在特殊窗体的赋值或初始化中使用的接收表达式

生成一个额外的非类型化布尔值。如果映射中存在键x,则ok的值为true,否则为false

元组分配将多值操作的各个元素分配给变量列表。有两种形式。在第一种情况下,右操作数是单个多值表达式,例如函数调用、通道或映射操作或类型断言。左侧的操作数必须与值的数目匹配。例如,如果f是一个返回两个值的函数

将第一个值指定给x,第二个值指定给y。在第二种形式中,左边的操作数必须等于右边的表达式数,每个表达式都必须是单值的,右边的第n个表达式被赋给左边的第n个操作数


因此,正如您看到的那样,这种行为是由语言设计指定的,而您自己无法实现为接收运算符和索引表达式指定的行为。

您基本上是在问:为什么Go实现语言规范?可能的重复。您基本上是在问:为什么Go实现语言规范规格?可能的副本。
c <- myChan

c, exist <- myChan
v, ok := x.(int)
// vs
v := x.(int)
x, ok = <-ch
x, ok := <-ch
var x, ok = <-ch
var x, ok T = <-ch
v, ok = a[x]
v, ok := a[x]
var v, ok = a[x]
var v, ok T = a[x]
x, y = f()