当前位置:   article > 正文

GO err is shadowed during return

go err is shadowed during return

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

//test.go

package main


import "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 main


import "fmt"
import "strconv"


func foo(x string) (ret int, err error) {
if true {
ret1, err1 := strconv.Atoi(x)
if err1 != nil {
err = err1
return
}
ret = ret1
}


return ret, nil
}


func main() {
fmt.Println(foo("123"))
}

运行:



声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/624968
推荐阅读
相关标签
  

闽ICP备14008679号