[转]GO err is shadowed during return
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 err is shadowed during return的更多相关文章
- Go-err is shadowed during return
where? Go程序函数中在通过 return关键字返回的时候,报错 why? 变量作用域的问题,在子作用域定义一个上层作用域的同名的变量 package main import ( "e ...
- Go语言常见的坑
目录 1. 可变参数是空接口类型 2. 数组是值传递 3.map遍历是顺序不固定 4. 返回值被屏蔽 5.recover必须在defer函数中运行 6. main函数提前退出 7.通过Sleep来回避 ...
- defer 要放在return之前
虽然defer可以在函数退出的时候执行,但是也要把它放在return之前,否则不会调用到. 错误的示范: res, err := Resource.open() if err != nil { ret ...
- golang中的defer和return的执行顺序
结论 go中是先给return准备返回值,再根据defer先进后出的规则执行,最后将返回值返回给调用者 测试用例1验证分析 代码片段如下: func foo_1() (err error) { def ...
- Go学习笔记01-语言
1.1 变量 Go 是静态类型语言,不能在运行期改变变量类型.使用关键字 var 定义变量,自动初始化为零值.如果提供初始化值,可省略变量类型,由编译器自动推断. var x int var f fl ...
- Go 1 Release Notes
Go 1 Release Notes Introduction to Go 1 Changes to the language Append Close Composite literals Goro ...
- 10 The Go Programming Language Specification go语言规范 重点
The Go Programming Language Specification go语言规范 Version of May 9, 2018 Introduction 介绍 Notation 符号 ...
- go——函数
1.定义 函数是结构化编程的最小单元模式.它将复杂的算法过程分解为若干个较小任务,隐藏相关细节,使程序结构更加清晰,易于维护.函数被设计成相对独立,通过接收输入参数完成一段算法指令,输出或存储相关结果 ...
- 菜鸟学Struts2——Actions
在对Struts2的工作原理学习之后,对Struts2的Action进行学习.主要对Struts2文档Guides中的Action分支进行学习,如下图: 1.Model Driven(模型驱动) St ...
随机推荐
- JasperReports® Library | Jaspersoft Community
JasperReport报表导出踩坑实录 - 小卖铺的老爷爷 - 博客园https://www.cnblogs.com/laoyeye/p/7707149.html jasperreport_百度百科 ...
- 《转载》最新鲜最详细的Android SDK下载安装及配置教程
Android开发环境搭建可以分: 第一步.安装JDK: 第二步.安装Eclipse: 第三步.下载并安装AndroidSDK: 下面详细介绍. 第一步.安装JDK Android开发工具要求必须 ...
- golang文件操作
一.读写文件 1.读文件操作 os.File 封装所有文件相关操作 例子: package main import ( "fmt" "os" "io/ ...
- document对象获取例子
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- bugku web 头等舱
什么也没有. 不行,他肯定把重要的东西隐藏了起来,首先查看源代码 真的什么也没有 burp抓包,看是不是在头部里,嘿嘿找到了
- java8list排序
https://blog.csdn.net/york_2016/article/details/80169467
- 常见的概率分布类型(Probability Distribution)
统计学中最常见的几种概率分布分别是正态分布(normal distribution),t分布(t distribution),F分布(F distribution)和卡方分布(χ2 distribut ...
- 查看Linux的所有线程
查看Linux所有线程有3种方法: ps -T <pid>可以看指定pid的所有线程,SPID就是指线程.或者用ps -eLf top -H,和普通的top命令相比,多了Thread ht ...
- java-最大连续子数组和(最大字段和)
1.题目要求 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的子段和的最大值.当所给的整数均为负数时定义子段和为0, ...
- Daily Codeforces 计划 训练时录
时间 场次 过题数目 补题数目 难易度 2019.4.7 codeforces-1141 ...