Go 多值回傳問題
在Go 中,從函數傳回多個值是常見語法做法,但可能會出現某些語法做法限制。讓我們探討為什麼以下代碼片段的行為不同:
有效代碼:
func FindUserInfo(id string) (Info, bool) { it, present := all[id] return it, present }
無效代碼:
func FindUserInfo(id string) (Info, bool) { return all[id] }
語法無效的原因:
第二個程式碼片段嘗試直接從地圖找all[id] 傳回兩個值。然而,Go 需要明確分配多個回傳值。
「Comma Ok」模式:
Go “Comma Ok”模式是一種提取值並傳回值的機制。存取映射鍵的布林指示符(通常名為 ok)。地圖、通道和類型斷言支援此模式。
在您的情況下,它是檢索到的值,並且present是一個布林值,指示該鍵是否存在於地圖中。逗號分隔的賦值 it,present := all[id] 隱式使用了這種模式。
理解 Unpack 方法:
Go 內部使用 unpack 方法來處理多重賦值。此方法根據運算元的模式(例如,對應索引、通道值、型別斷言)來決定賦值是否為「逗號 ok」情況。
預設情況下,unpack 方法僅允許逗號 ok 賦值當對左邊的兩個變數進行賦值時。這個限制是在 Checker.initVars() 方法中設定的。
結論:
Go 中的「comma ok」模式可以從映射、通道、和類型斷言。但是,需要明確分配回傳值,並且編譯器將逗號 ok 賦值限制為左側存在兩個變數的情況。
以上是為什麼 Go 需要對多值傳回明確賦值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!