【Golang】幽灵变量(变量覆盖)问题的一劳永逸解决方法

背景

在我们公司,测试定位问题的能力在考核中占了一定的比例,所以我们定位问题的主动性会比较高。因为很多开发同学都是刚开始使用golang,所以bug频出,其中又以短变量声明语法导致的错误最多。所以就专门搜索了相关的内容。

在一篇叫做50 Shades of Go: Traps, Gotchas, and Common Mistakes for New Golang Devs的文章中找到了解决方案。
1172048-20180929225059948-278904812.png

中文翻译如下:

不小心覆盖的变量

对从动态语言转过来的开发者来说,简短声明很好用,这可能会让人误会 := 是一个赋值操作符。

如果你在新的代码块中像下边这样误用了 :=,编译不会报错,但是变量不会按你的预期工作:

func main() {
    x := 1
    println(x)      // 1
    {
        println(x)  // 1
        x := 2
        println(x)  // 2    // 新的 x 变量的作用域只在代码块内部
    }
    println(x)      // 1
}

这是 Go 开发者常犯的错,而且不易被发现。

可使用官方提供的vet 工具来诊断这种变量覆盖,它默认是不会自动执行的:

> go tool vet -shadow main.go
main.go:9: declaration of "x" shadows declaration at main.go:5

但是官方的vet 不会报告全部被覆盖的变量,这时候我们就要借助第三方包 —— go-nyet 来做进一步的检测了。

go-nyet

获取的方式
go get github.com/barakmich/go-nyet
运行方法

这个包的运行方式有三种:目录/包/文件。对应的命令如下:

go-nyet ./...
# or
go-nyet subpackage
# or
go-nyet file.go
实际使用

使用方法如下:

> $GOPATH/bin/go-nyet main.go
main.go:10:3:Shadowing variable `x`
为什么写这个包?

作者在readme文档中描述了为什么写这个包:

I've been bitten by too many bugs caused by the shadowing of Go variables within subblocks. The time has come to end them once and for all.

从上面这段话可以看出这个包是作者对这个变量覆盖问题烦不胜烦之后,一劳永逸的解决方案。

关于go-nyet更详细的内容可以访问原项目:https://github.com/barakmich/go-nyet

转载于:https://www.cnblogs.com/Detector/p/9726930.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值