轻松一刻:Go 1.18修复了一个经典bug

本文介绍了Go语言中一个经典的编译错误——局部变量未作为右值使用,以及在Go 1.18之前版本中,即使变量在闭包中未使用,编译器也可能不报错的bug。Go 1.18开始修复了这个问题,现在编译会正确报告"declared but not used"错误。详细讨论和开源代码可在官方链接查看。
摘要由CSDN通过智能技术生成

前言

大家在写Go的时候,初期应该都会遇到过下面的编译报错:

declared but not used

比如下面的代码示例:

// example2.go
package main

func main() {
	a := 10
	a = 1
}

执行 go run example2.go,会报如下编译错误:

./example2.go:5:2: a declared but not used

原因

上面的报错,实际上是因为对于标准Go编译器,局部变量必须至少有一次被作为右值(r-value: right-hand-side-value)使用过。

上面的例子里局部变量a都是左值,并没有作为右值被使用过,因此编译报错。

我们来看一个新的例子,大家觉得下面的代码,执行go run example2.go的结果是什么?

// example2.go
package main

func main() {
	a := 10
	func() {
		a = 1
	}()
}

结论

按理来说,上面的示例里头,局部变量a在闭包里没有被作为右值使用过,还是应该会编译报错”declared but not used“。

但是大家知道么,Go标准编译器对于”declared but not used“这样的检查,也会有bug。

上面的代码如果是Go1.18之前的版本,执行的话,结果是没有任何报错。

从Go1.18版本开始,解决了局部变量在闭包里没被使用但是编译器不报错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值