首页 > 学院 > 开发设计 > 正文

GO err is shadowed during return

2019-11-06 06:42:42
字体:
来源:转载
供稿:网友

这里先复现问题,然后进行问题说明。

//test.go

package mainimport "fmt"import "strconv"func foo(x string) (ret int, err error) {	if true {		ret, err := strconv.Atoi(x)		if err != nil {			return		}	}	return ret, nil}func main() {	fmt.PRintln(foo("123"))}

运行:

OK,问题复现了,下面进行问题分析。

func foo(x string) (ret int, err error) {//返回值列表定义了ret和err变量,作用域是整个函数体if true {//新的语句块ret, err := strconv.Atoi(x)  //这里又定义了新的变量ret和err,和返回值列表重名了。作用域是if语句块if err != nil {return  //这里的return语句会导致外层的ret和err被返回,而不是if语句里的ret和err}}return ret, nil}

来自网上的解释:

It's a new scope, so a naked return returns the outer err, not your inner err that was != nil.So it's almost certainly not what you meant, hence the error.下面进行修改(只需要保证局部变量和全局变量不重名即可):

//test.go

package mainimport "fmt"import "strconv"func foo(x string) (ret int, err error) {if true {ret1, err1 := strconv.Atoi(x)if err1 != nil {err = err1return}ret = ret1}return ret, nil}func main() {fmt.Println(foo("123"))}

运行:


上一篇:构造函数

下一篇:什么是KMP匹配算法?

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表