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. 通过后缀名和MIME-TYPE检查实现文件类型校验

    前言 文件上传是一个在开发中很常见的需求场景,通常出于安全考虑,我们会对上传的文件进行类型校验,其中常见的有后缀名校验,mime-type校验 话不多说,直接上代码 1.首先定义允许上传的文件类型白名 ...

  2. 图解从 URL 到网页通信原理

    前言 一.文本对话--从请求到响应 二.TCP/IP 协议族介绍 三.基于TCP/IP通信过程 四.TCP建立连接及断开(重点补充) 小结 前言 互联网的原始目的,就是为了传输文本(文本对话).那我们 ...

  3. React笔记:组件(3)

    1. 组件定义 组件是React的核心概念,组件将应用的UI拆分成独立的.可复用的模块. 定义组件的两种方式: (1)类组件:使用ES6 class (2)函数组件:使用函数 使用class定义组件的 ...

  4. codeforces510D

    Fox And Jumping CodeForces - 510D Fox Ciel is playing a game. In this game there is an infinite long ...

  5. 标准3层神经网络搭建Demo

    上面我们说了神经网络的基础知识,根据上章的基础尝试搭建一个标准的3层神经网络,参考https://www.cnblogs.com/bestExpert/p/9128645.html 1.框架代码 1. ...

  6. EnableEurekaServer基本配置

    pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  7. jmeter笔记(4)--测试上传附件

    性能测试过程中有HTTP请求上传附件的场景,记录一下运用fiddler和jmeter实现jforum发表上传附件的帖子的过程. 1.fiddler录制脚本 2.打开录制的脚本,调整信息头管理器中信息 ...

  8. 分布式协调服务Zookeeper集群监控JMX和ZkWeb应用对比

    分布式协调服务Zookeeper集群监控JMX和ZkWeb应用对比 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. JMX是用来远程监控Java应用的框架,这个也可以用来监控其他的J ...

  9. Unity认证

    Unity Education- 国际认证 Certified Instructor 培训师认证 Certified User 应用能力认证

  10. jQuery使用():Callbacks回调函数列表之异步编程(含源码分析)

    Callbacks的基本功能回调函数缓存与调用 特定需求模式的Callbacks Callbacks的模拟源码 一.Callbacks的基本功能回调函数缓存与调用 Callbacks即回调函数集合,在 ...