在golang中返回输入变量
我刚开始使用Golang,我看到了典型的交换函数示例:
func swap(x,y string) (string,string) { return y,x } 我自动认为命名的返回可以解决它并且它是一个更甜的例子,所以我尝试了更短的版本: package main import "fmt" func swap(z,y int) (z,y int) { return } func main() { fmt.Println(swap(2,3)) } 但令我惊讶的是,它没有编译抱怨重复的论点.为什么不能返回输入参数?我做错了什么还是不支持? 我认为这是一个完全有效的用例,并且可能有许多其他示例用于此用法. 解决方法
我也是Golang的初学者.这是我设法找到的.
问题基本上是,您声明了两个名为z的变量,然后期望它们是统一的.这不受支持,实际上会违反命名返回类型的主要目标,即记录返回值的含义. 要更详细地解释,这有点像编写以下代码: func badFunction(a int) int { var a int = 0 return a } 变量被声明两次,这对Go来说很困惑.如果我们看一下‘tour of go’对命名返回值的看法,我们可以看到问题.它不是最大的来源,但它仍然是一个来源:
也就是说,你的例子几乎就像badFunction一样.对于编译器,它看起来有点像这样: func swap(a,b int) (int,int) { var a int = 0 var b int = 0 return b,a } 当然,编译器抱怨在块中重新声明,这是一个相关的,虽然不可否认的错误.您在那里收到的错误消息似乎基本上是一个预先检查,以防止用户看到desugared生成的代码. 正如this Stackoverflow question报告所述,命名返回值应基本上仅用于文档.但是,它确实提到了意外阴影的可能性.可能是早期的Go版本支持此功能,但此后已经更改以防止由??于此类名称冲突而导致的错误,但是我没有找到与此相关的任何内容. 关于这个话题的effective go section也有话要说:
TL; DR:编译器不会以您期望的方式统一名称.这种隐式阴影不受支持,应该主动避免,以防止某些容易避免的错误. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |