2 回答

TA貢獻1995條經(jīng)驗 獲得超2個贊
看看Go 之旅中的這個頁面。它解釋說:
就像for,該if語句可以以在條件之前執(zhí)行的短語句開始。
鑒于你的例子:
h, ok := route[request.URL.String()]; ok { ... }
簡短的聲明是h, ok := route[request.URL.String()]。在;后商標(biāo)的簡短聲明的結(jié)尾。在ok隨后的條件。如果為真,則執(zhí)行代碼塊{...}。在該代碼塊中,您可以使用在短語句中分配的所有變量。
首先,ok在將其分配給的結(jié)果后聲明如何在語法上有效route()?
ok賦值后不聲明。它是一個布爾值,用于條件中。
第二,如果h is returned byroute() , how can it be used in the definition ofok`???
這不是 的定義ok。它是if語句的代碼塊。
考慮這種替代的,幾乎等效的寫作風(fēng)格:
h, ok := route[request.URL.String()]
if ok {
h(writer, request)
return
}
這很清楚,對吧?我們只是將原始代碼拆分為兩步。但這不一樣。以這種方式編寫時,h和ok變量在if語句之后可見。這是不可取的。將變量的可見性(也稱為live time)最小化是一種很好的做法。變量可見的時間越長,它可能被意外誤用的漏洞窗口就越長。Go 的這種語法真是太棒了,天才,而且我不知道任何其他語言if可以實現(xiàn)這種語句。

TA貢獻1868條經(jīng)驗 獲得超4個贊
首先:您應(yīng)該完成 Go Tour - 特別是地圖部分:https : //tour.golang.org/moretypes/16
這里的“逗號,好的”習(xí)語旨在檢查映射中是否存在密鑰。對不存在的鍵進行查找會導(dǎo)致恐慌(并且可能會使您的應(yīng)用程序崩潰)。
if h, ok := route[request.URL.String()]; ok { h(writer, request) }
如果
request.URL.String()
存在,設(shè)置h
并設(shè)置ok
為true。如果
ok
為真,則調(diào)用函數(shù)h
。否則,將 URL 寫入響應(yīng)(并且什么也不做)。
- 2 回答
- 0 關(guān)注
- 185 瀏覽
添加回答
舉報