[转]GO err is shadowed during return
Go is return during ERR
2023-09-11 14:18:06 时间
1 前言
有时候编译Go项目会出现GO err is shadowed during return的问题,是因为作用域导致变量重名,return时不是你预期的变量导致的。
2 样例
这里先复现问题,然后进行问题说明。
//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.
下面进行修改(只需要保证局部变量和全局变量不重名即可):
3 解决方案
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 }
运行:
4 参考
转载于:https://blog.csdn.net/wo198711203217/article/details/60574268
相关文章
- go encoding/json库详解
- Go strconv模块:字符串和基本数据类型之间转换
- go语言实现分布式对象存储系统之单体对象存储
- go build报错,提示错误can‘t load package: package xxx is not in GOROOT
- 【Go命令教程】6. go doc 与 godoc
- Go 语言体系下的微服务框架选型:Dubbo-go
- Nacos Go 微服务生态系列(一)| Dubbo-go 云原生核心引擎探索
- go在线图书
- 【Go语言】【7】GO语言的切片
- 如何避开 Go 中的各种陷阱 [译]
- Kali Linux安装go语言环境详解
- Go支持自定义数据类型:使用type来定义,类似于数据类型的一个别名
- [Go] 让 go build 生成的可执行文件对 Mac、linux、Windows 平台一致
- [Go] go build 减小二进制文件大小的几种方式
- Atitit golang开发环境搭建 目录 1. 编辑helo.go1 1.1. 调试编译1 2. Ide选择liteide2 3. 问题解决2 4. 附录2 4.1. Go语言标准库常
- 我的Go+语言初体验——go【Format】goplus
- Go语言自学系列 | go常用命令
- linux go 安装 卸载 1.15.7
- 写代码实现两个 goroutine,其中一个产生随机数并写入到 go channel 中,另外一 个从 channel 中读取数字并打印到标准输出。最终输出五个随机数。
- package wang/test is not in GOROOT (/usr/local/go/src/wang/test)
- GO语言教程(一)Linux( Centos)下Go的安装, 以及HelloWorld
- Go 变量 字符类型 byte rune
- Go 函数和方法:Go 语言中的函数和方法到底有什么不同?