加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在golang中返回输入变量

发布时间:2020-12-16 09:26:29 所属栏目:大数据 来源:网络整理
导读:我刚开始使用Golang,我看到了典型的交换函数示例: func swap(x,y string) (string,string) { return y,x} 我自动认为命名的返回可以解决它并且它是一个更甜的例子,所以我尝试了更短的版本: package mainimport "fmt"func swap(z,y int) (z,y int) { return
我刚开始使用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’对命名返回值的看法,我们可以看到问题.它不是最大的来源,但它仍然是一个来源:

Go’s return values may be named. If so,they are treated as variables defined at the top of the function.

也就是说,你的例子几乎就像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也有话要说:

The return or result “parameters” of a Go function can be given names and used as regular variables,just like the incoming parameters. When named,they are initialized to the zero values for their types when the function begins; if the function executes a return statement with no arguments,the current values of the result parameters are used as the returned values.

The names are not mandatory but they can make code shorter and clearer: they’re documentation.

TL; DR:编译器不会以您期望的方式统一名称.这种隐式阴影不受支持,应该主动避免,以防止某些容易避免的错误.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读