常見的 if 語句大約是這個樣子的(C++):
Event event = getEvent();
if (event == EventA) {
processA(event);
} else {
processB(event);
}
這樣有一個問題:變量 event 定義在了 if 語句的外面荐绝,也就是說社痛,在 if 語句之后胀蛮,也可以繼續(xù)使用 event 變量乾胶;而如果后續(xù)的操作中不需要 event 變量了,它實(shí)際上就造成了命名空間的污染谴轮。這并不是一個嚴(yán)重的問題炒瘟,多數(shù)情況下不會造成任何問題,而如果一定要解決的話第步,在 C++ 中可以在 event 的定義之外套一層大括號來限定它的作用域疮装。雖然代碼看上去有一些奇怪,但無傷大雅粘都。比如這樣:
{
Event event = getEvent();
if (event == EventA) {
processA(event);
} else {
processB(event);
}
}
但是 Go 的設(shè)計者不知是出于什么原因廓推,非要從語法上解決這個問題。于是 Go 中的 if 語句可以寫成這個樣子:
if event := getEvent(); event == EventA {
processA(event)
} else {
processB(event)
}
對翩隧,你沒有看錯樊展。雖然 event 是定義在了 if 中,但它在 else 中也是可以用的堆生。也就是說专缠,這種寫法實(shí)際上是上述的 C++ 寫法的語法糖。
并不清楚 Go 的設(shè)計者添加這個語法糖的目的是什么淑仆。它僅僅是為了解決變量的作用域問題而提出涝婉,卻犧牲了代碼的可讀性。if 語句可能會變得過長而不易閱讀蔗怠;在后續(xù)重構(gòu)的過程中墩弯,拆分 if 語句也會變得困難。為了解決一個小問題而增加一種有問題的語法寞射,看上去有點(diǎn)得不嘗失渔工。