當嘗試在Go 中傳回多個值時,為什麼某些語法有效而其他語法無效,這似乎令人困惑。為了說明這一點,請考慮以下兩個程式碼片段:
func FindUserInfo(id string) (Info, bool) { it, present := all[id] return it, present }
第一個程式碼片段有效並傳回 Info 和 bool 值。但是,第二個片段無效:
func FindUserInfo(id string) (Info, bool) { return all[id] }
這提出了為什麼第一個片段有效而第二個片段無效的問題。此外,人們可能想知道是否有一種方法可以避免使用像 it 和present 這樣的臨時變數。
理解這種行為的關鍵在於「comma好的」模式。在 Go 中,存取映射時,結果是一對值:與鍵關聯的值和指示該鍵是否存在於映射中的布林值。這通常用於區分遺失的鍵和零值。
在第一個程式碼片段中,all[id] 表達式傳回一對值,這些值被指派給它並存在。然後 return 語句傳回這些值。
編譯器在決定多值賦值是否有效方面發揮作用。如果函數傳回多個值,但左側的接收者只有一個變量,編譯器將發出錯誤。這是因為編譯器期望傳回的值的數量與接收它們的變數的數量相符。
在第二個程式碼片段的情況下,return all[id] 表達式只傳回一個值,這是不相容的左側有兩個變數。因此,編譯器會報告錯誤。
不幸的是,在 Go 函數中傳回多個值時,無法避免使用臨時變數。這是因為編譯器要求傳回值的數量與接收它們的變數的數量相符。但是,可以透過使用命名傳回值或傳回結構來最大限度地減少臨時變數的使用。
以上是為什麼 Go 函數不能直接傳回多個值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!