Go 為什么不支持前綴自增運(yùn)算符?
大家好,我是煎魚(yú)。
習(xí)慣性對(duì)比,類(lèi)比學(xué)習(xí),是大家掌握新技能時(shí)會(huì)習(xí)慣性的關(guān)聯(lián)操作。像 Go 這種比較有味道的編程語(yǔ)言,其有一個(gè)細(xì)節(jié)也是大家很好奇的。
其實(shí) Go 只支持后自增/自減,不支持前綴自增/自減,比較神奇。今天煎魚(yú)和大家一起研究為什么。
語(yǔ)法
基本的 Go 自增,非常簡(jiǎn)單。直接見(jiàn)代碼:
a := 1
a++
fmt.Println(a)
輸出結(jié)果:
2
如果回答輸出結(jié)果錯(cuò)了,建議右拐語(yǔ)法了。接下來(lái)看看其他幾個(gè)例子,與你預(yù)想的運(yùn)行結(jié)果是否一致。
例子 1,代碼如下:
func main() {
a := 1
b := a++
fmt.Println(b)
}
輸出的結(jié)果:
# command-line-arguments
./main.go:9:8: syntax error: unexpected ++ at end of statement
例子 2,代碼如下:
func main() {
a := 1
++a
fmt.Println(a)
}
輸出的結(jié)果:
# command-line-arguments
./main.go:9:2: syntax error: unexpected ++, expecting }
你會(huì)發(fā)現(xiàn)這兩個(gè)例子,在其他常見(jiàn)語(yǔ)言中都是正常的。但在 Go 中竟然會(huì)運(yùn)行錯(cuò)誤?
原因
Go 在設(shè)計(jì)上:
沒(méi)有支持前綴自增自減的運(yùn)算語(yǔ)句,也就是不允許 ++a。 運(yùn)算符 ++ 和 -- 只能作為一個(gè)語(yǔ)句來(lái)使用,不可以作為表達(dá)式被賦值給其它的變量使用。
參照以下例子:
在語(yǔ)句中,++ 是可以的。 在賦值 = 中 ++ 是不可以。
那為什么就不支持了呢?本質(zhì)上 Go 的設(shè)計(jì)者是為了讓代碼擁有更好的可讀性,也不需要糾結(jié)求值順序了。
單從程序上來(lái)看,區(qū)分前綴自增,還是后綴自增,運(yùn)行結(jié)果上都是一樣的。但一旦引入,會(huì)加大程序員的犯錯(cuò)可能性,經(jīng)常會(huì)有人混淆,偶爾還會(huì)有人搞成面試題來(lái)考考應(yīng)聘者。
顯然,不支持前綴和賦值,++、-- 僅作為一個(gè)語(yǔ)句能夠在 Go 代碼上起到可讀性提高的作用,簡(jiǎn)化意義重大。
總結(jié)
今天這篇文章,我們針對(duì) Go 語(yǔ)法設(shè)計(jì)中的 ++、-- 這個(gè)細(xì)節(jié)進(jìn)行了摸索和討論。實(shí)際上 a++,還是 --a,又或是更加復(fù)雜的混合表達(dá)式,更多的只能在面試或編寫(xiě)時(shí)迷惑后來(lái)的小伙伴。
在 Go 工程化的道路上并不能帶來(lái)過(guò)多的收益,所以自然也就被拿掉了。
你有沒(méi)有試過(guò)被各種奇怪的前綴、后綴、混合迷惑過(guò)呢?
推薦閱讀
參考
Go FAQ 為什么go語(yǔ)言語(yǔ)法要這樣設(shè)計(jì)呢? go 語(yǔ)言的 ++ 操作。沒(méi)有自增操作?
關(guān)注煎魚(yú),獲取業(yè)內(nèi)第一手消息和知識(shí) ??

你好,我是煎魚(yú),出版過(guò) Go 暢銷(xiāo)書(shū)《Go 語(yǔ)言編程之旅》,再到獲得 GOP(Go 領(lǐng)域最有觀(guān)點(diǎn)專(zhuān)家)榮譽(yù),點(diǎn)擊藍(lán)字查看我的出書(shū)之路。
日常分享高質(zhì)量文章,輸出 Go 面試、工作經(jīng)驗(yàn)、架構(gòu)設(shè)計(jì),加微信拉讀者交流群,和大家交流!
