首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何理解金刚多回值

问如何理解金刚多回值
EN

Stack Overflow用户
提问于 2017-09-18 04:28:00
回答 2查看 2.3K关注 0票数 1

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

代码语言:javascript
复制
func test() (string, string) {
  return "1", "1"
}

a, b := test()

或

代码语言:javascript
复制
a, _ := test()

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

代码语言:javascript
复制
b = test()   //wrong

但是对于一些内置类型,如[]或<-,则支持可变数量的返回值。

代码语言:javascript
复制
key, exist := map[key]

key := map[key]

我可以从这样的频道读取值

代码语言:javascript
复制
c <- myChan

c, exist <- myChan

我们如何解释这种不一致?这是为核心go运行时/语言保留的功能吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-18 04:48:28

此行为在金刚规格中明确指定。

  1. 接收操作员

用于特殊表单的赋值或初始化的接收表达式。

代码语言:javascript
复制
x, ok = <-ch
x, ok := <-ch
var x, ok = <-ch
var x, ok T = <-ch

生成一个额外的非类型布尔值结果,报告通信是否成功。如果通过成功的发送操作将接收到的值传递到通道,则ok的值为true;如果由于通道关闭和空,产生的值为零,则为false。

  1. 索引表达式

mapKV类型的映射a上的索引表达式,用于特殊窗体的赋值或初始化

代码语言:javascript
复制
v, ok = a[x]
v, ok := a[x]
var v, ok = a[x]
var v, ok T = a[x]

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

  1. 作业

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

代码语言:javascript
复制
x, y = f()

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

因此,正如您可以看到的那样,这种行为是由语言设计指定的,并且您无法自己实现为Receive operator和Index expression指定的行为。

票数 12
EN

Stack Overflow用户

发布于 2017-09-18 04:40:42

您正在混淆从函数返回的多个值和所谓的“逗号ok”成语。

对于函数的返回值,您必须要么处理所有这些值,要么不处理它们。很简单。

“逗号”是比较微妙的。通常,如果指定了第二个值,则会更改行为。请考虑以下发言:

代码语言:javascript
复制
v, ok := x.(int)
// vs
v := x.(int)

如果x是一个包含整数的接口,那么一切都很好,但是,如果x持有不同的类型,那么第一条语句就能工作(返回0, false),第二条语句就会恐慌。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46271620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档