Golang变量遮蔽——Shadowing

2023-10-29 17:30
文章标签 golang 变量 遮蔽 shadowing

本文主要是介绍Golang变量遮蔽——Shadowing,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在golang中,我们经常会用:=来声明变量,这很方便但也会带来一些问题。当变量遇到作用域时就容易产生shadowing。

 

比如说我们经常会遇到的:

shadow: declaration of "err" shadows declaration

 

什么是变量隐藏呢?

 

就是当年在后面重新声明了前面已经声明的同名变量时,后面的变量值会遮蔽前面的变量值,虽然这两个变量同名但值却不一样。这样是很容易产生问题的。

 

举个栗子来看一下:

func main() {n := 0if true {n := 1n++}fmt.Println(n) // 0}这个结果n=0

 

这里因为在if的作用域中对n重新声明了,所以里面的n++对外面的n并不起作用。

 

如果是在里面对n直接赋值而不是重新声明呢?

func main() {n := 0if true {n = 1n++}fmt.Println(n) // 2}这里结果n=2

 

 

这么明显的情况我们写代码的时候很容易发现,但如果是很复杂的代码呢,尤其是遇到err的时候真的很容易Shadowing。

 

再举个栗子:

func templateToFile(templateFilename string, filename string, data interface{}) (err error) {if f, err := os.OpenFile(filename, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0666); err == nil {defer f.Close()if t, err := template.ParseFiles(templateFilename); err == nil {return t.Execute(f, data)}}return}

 

这里第一个if作用域中的err和第二个作用域中的err不是同一个东西,但又是相同名的变量,所以也会造成变量遮蔽。

如何解决呢,这种一般把第二个err变量改名或者用赋值代理重新声明就可以解决了。

 

那对于这种变量遮蔽的情况,如何检测呢?

 

情况严重的话你的代码会直接编译失败,但如果不严重的情况你的代码是跑的起来的,但仍然会存在遮蔽的情况。

 

1,可以用vet,Go 1.12 以上的版本需要

go install golang.org/x/tools/go/analysis/passes/shadow/cmd/shadowgo vet -vettool=$(which shadow)

 

2,也可以用goland的tool工具(我一般用这种)

 

3,还可以用golangci-lint工具,也可以检测出来。

 

 

 

这篇关于Golang变量遮蔽——Shadowing的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/302209

相关文章

Python之变量命名规则详解

《Python之变量命名规则详解》Python变量命名需遵守语法规范(字母开头、不使用关键字),遵循三要(自解释、明确功能)和三不要(避免缩写、语法错误、滥用下划线)原则,确保代码易读易维护... 目录1. 硬性规则2. “三要” 原则2.1. 要体现变量的 “实际作用”,拒绝 “无意义命名”2.2. 要让

SpringBoot中@Value注入静态变量方式

《SpringBoot中@Value注入静态变量方式》SpringBoot中静态变量无法直接用@Value注入,需通过setter方法,@Value(${})从属性文件获取值,@Value(#{})用... 目录项目场景解决方案注解说明1、@Value("${}")使用示例2、@Value("#{}"php

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

全面解析Golang 中的 Gorilla CORS 中间件正确用法

《全面解析Golang中的GorillaCORS中间件正确用法》Golang中使用gorilla/mux路由器配合rs/cors中间件库可以优雅地解决这个问题,然而,很多人刚开始使用时会遇到配... 目录如何让 golang 中的 Gorilla CORS 中间件正确工作一、基础依赖二、错误用法(很多人一开

Spring Boot中的路径变量示例详解

《SpringBoot中的路径变量示例详解》SpringBoot中PathVariable通过@PathVariable注解实现URL参数与方法参数绑定,支持多参数接收、类型转换、可选参数、默认值及... 目录一. 基本用法与参数映射1.路径定义2.参数绑定&nhttp://www.chinasem.cnbs

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

golang版本升级如何实现

《golang版本升级如何实现》:本文主要介绍golang版本升级如何实现问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录golanwww.chinasem.cng版本升级linux上golang版本升级删除golang旧版本安装golang最新版本总结gola

golang中reflect包的常用方法

《golang中reflect包的常用方法》Go反射reflect包提供类型和值方法,用于获取类型信息、访问字段、调用方法等,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录reflect包方法总结类型 (Type) 方法值 (Value) 方法reflect包方法总结

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景