当尝试在 Go 中返回多个值时,为什么某些语法有效而其他语法无效似乎令人困惑。为了说明这一点,请考虑以下两个代码片段:
func FindUserInfo(id string) (Info, bool) { it, present := all[id] return it, present }
第一个代码片段有效并返回 Info 和 bool 值。但是,第二个片段无效:
func FindUserInfo(id string) (Info, bool) { return all[id] }
这就提出了一个问题:为什么第一个片段有效而第二个片段无效。此外,人们可能想知道是否有一种方法可以避免使用像 it 和present 这样的临时变量。
理解这种行为的关键在于“comma好的”模式。在 Go 中,访问映射时,结果是一对值:与键关联的值和指示该键是否存在于映射中的布尔值。这通常用于区分丢失的键和零值。
在第一个代码片段中,all[id] 表达式返回一对值,这些值被分配给它并存在。然后 return 语句返回这些值。
编译器在确定多值赋值是否有效方面发挥着作用。如果函数返回多个值,但左侧的接收者只有一个变量,编译器将发出错误。这是因为编译器期望返回的值的数量与接收它们的变量的数量相匹配。
在第二个代码片段的情况下,return all[id] 表达式仅返回一个值,这是不兼容的左侧有两个变量。因此,编译器会报告错误。
不幸的是,在 Go 函数中返回多个值时,无法避免使用临时变量。这是因为编译器要求返回值的数量与接收它们的变量的数量相匹配。但是,可以通过使用命名返回值或返回结构来最大限度地减少临时变量的使用。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3