Go 为什么不支持前缀自增运算符?

Go语言不支持前缀自增/自减运算,这一设计旨在提升代码可读性和避免求值顺序引发的错误。文章通过示例展示了Go中自增自减的用法,并解释了这种设计的原因,强调了在Go中++和--只能作为独立语句使用,不能用于赋值表达式,以提高代码清晰度。
摘要由CSDN通过智能技术生成

大家好,我是煎鱼。

习惯性对比,类比学习,是大家掌握新技能时会习惯性的关联操作。像 Go 这种比较有味道的编程语言,其有一个细节也是大家很好奇的。

其实 Go 只支持后自增/自减,不支持前缀自增/自减,比较神奇。今天煎鱼和大家一起研究为什么。

语法

基本的 Go 自增,非常简单。直接见代码:

a := 1
a++

fmt.Println(a)

输出结果:

2

如果回答输出结果错了,建议右拐语法了。接下来看看其他几个例子,与你预想的运行结果是否一致。

例子 1,代码如下:

func main() {
 a := 1
 b := a++
 fmt.Println(b)
}

输出的结果:

# command-line-arguments
./main.go:9:8: syntax error: unexpected ++ at end of statement

例子 2,代码如下:

func main() {
 a := 1
 ++a
 fmt.Println(a)
}

输出的结果:

# command-line-arguments
./main.go:9:2: syntax error: unexpected ++, expecting }

你会发现这两个例子,在其他常见语言中都是正常的。但在 Go 中竟然会运行错误?

原因

Go 在设计上:

  1. 没有支持前缀自增自减的运算语句,也就是不允许 ++a。

  2. 运算符 ++ 和 -- 只能作为一个语句来使用,不可以作为表达式被赋值给其它的变量使用。

参照以下例子:

  • 在语句中,++ 是可以的。

  • 在赋值 = 中 ++ 是不可以。

那为什么就不支持了呢?本质上 Go 的设计者是为了让代码拥有更好的可读性,也不需要纠结求值顺序了。

单从程序上来看,区分前缀自增,还是后缀自增,运行结果上都是一样的。但一旦引入,会加大程序员的犯错可能性,经常会有人混淆,偶尔还会有人搞成面试题来考考应聘者。

显然,不支持前缀和赋值,++、-- 仅作为一个语句能够在 Go 代码上起到可读性提高的作用,简化意义重大。

总结

今天这篇文章,我们针对 Go 语法设计中的 ++、-- 这个细节进行了摸索和讨论。实际上 a++,还是 --a,又或是更加复杂的混合表达式,更多的只能在面试或编写时迷惑后来的小伙伴。

在 Go 工程化的道路上并不能带来过多的收益,所以自然也就被拿掉了。

你有没有试过被各种奇怪的前缀、后缀、混合迷惑过呢?

推荐阅读

参考

  • Go FAQ

  • 为什么go语言语法要这样设计呢?

  • go 语言的 ++ 操作。没有自增操作?

关注煎鱼,获取业内第一手消息和知识 👇

9574f591616a94d1c9d8fb3e1dfcf259.png

9a0af08b4cceef3ee1340c971cf92ce6.png

你好,我是煎鱼,出版过 Go 畅销书《Go 语言编程之旅》,再到获得 GOP(Go 领域最有观点专家)荣誉,点击蓝字查看我的出书之路

日常分享高质量文章,输出 Go 面试、工作经验、架构设计,加微信拉读者交流群,和大家交流!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值