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的更多相关文章

  1. Go-err is shadowed during return

    where? Go程序函数中在通过 return关键字返回的时候,报错 why? 变量作用域的问题,在子作用域定义一个上层作用域的同名的变量 package main import ( "e ...

  2. Go语言常见的坑

    目录 1. 可变参数是空接口类型 2. 数组是值传递 3.map遍历是顺序不固定 4. 返回值被屏蔽 5.recover必须在defer函数中运行 6. main函数提前退出 7.通过Sleep来回避 ...

  3. defer 要放在return之前

    虽然defer可以在函数退出的时候执行,但是也要把它放在return之前,否则不会调用到. 错误的示范: res, err := Resource.open() if err != nil { ret ...

  4. golang中的defer和return的执行顺序

    结论 go中是先给return准备返回值,再根据defer先进后出的规则执行,最后将返回值返回给调用者 测试用例1验证分析 代码片段如下: func foo_1() (err error) { def ...

  5. Go学习笔记01-语言

    1.1 变量 Go 是静态类型语言,不能在运行期改变变量类型.使用关键字 var 定义变量,自动初始化为零值.如果提供初始化值,可省略变量类型,由编译器自动推断. var x int var f fl ...

  6. Go 1 Release Notes

    Go 1 Release Notes Introduction to Go 1 Changes to the language Append Close Composite literals Goro ...

  7. 10 The Go Programming Language Specification go语言规范 重点

    The Go Programming Language Specification go语言规范 Version of May 9, 2018 Introduction 介绍 Notation 符号 ...

  8. go——函数

    1.定义 函数是结构化编程的最小单元模式.它将复杂的算法过程分解为若干个较小任务,隐藏相关细节,使程序结构更加清晰,易于维护.函数被设计成相对独立,通过接收输入参数完成一段算法指令,输出或存储相关结果 ...

  9. 菜鸟学Struts2——Actions

    在对Struts2的工作原理学习之后,对Struts2的Action进行学习.主要对Struts2文档Guides中的Action分支进行学习,如下图: 1.Model Driven(模型驱动) St ...

随机推荐

  1. JasperReports® Library | Jaspersoft Community

    JasperReport报表导出踩坑实录 - 小卖铺的老爷爷 - 博客园https://www.cnblogs.com/laoyeye/p/7707149.html jasperreport_百度百科 ...

  2. 《转载》最新鲜最详细的Android SDK下载安装及配置教程

    Android开发环境搭建可以分: 第一步.安装JDK: 第二步.安装Eclipse: 第三步.下载并安装AndroidSDK:   下面详细介绍. 第一步.安装JDK Android开发工具要求必须 ...

  3. golang文件操作

    一.读写文件 1.读文件操作 os.File 封装所有文件相关操作 例子: package main import ( "fmt" "os" "io/ ...

  4. document对象获取例子

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  5. bugku web 头等舱

    什么也没有. 不行,他肯定把重要的东西隐藏了起来,首先查看源代码 真的什么也没有 burp抓包,看是不是在头部里,嘿嘿找到了

  6. java8list排序

    https://blog.csdn.net/york_2016/article/details/80169467

  7. 常见的概率分布类型(Probability Distribution)

    统计学中最常见的几种概率分布分别是正态分布(normal distribution),t分布(t distribution),F分布(F distribution)和卡方分布(χ2 distribut ...

  8. 查看Linux的所有线程

    查看Linux所有线程有3种方法: ps -T <pid>可以看指定pid的所有线程,SPID就是指线程.或者用ps -eLf top -H,和普通的top命令相比,多了Thread ht ...

  9. java-最大连续子数组和(最大字段和)

    1.题目要求   给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的子段和的最大值.当所给的整数均为负数时定义子段和为0, ...

  10. Daily Codeforces 计划 训练时录

    时间                 场次                             过题数目      补题数目   难易度 2019.4.7      codeforces-1141 ...