了解Go 介面的錯誤處理行為
在Go 程式語言中,介面提供了一個強大的機制來定義類型之間的契約。其中一種契約是“Error”接口,它允許類型表示錯誤。本文探討了一種特定場景,其中為自訂類型定義「Error」方法會導致意外輸出。
問題:
考慮以下程式碼片段:
type T int func (t T) Error() string { return "bad error" } func main() { var v interface{} = T(5) fmt.Println(v) //output: bad error, not 5 }
當你執行這段程式碼時,輸出是「bad error ”而不是預期的整數值5。這是為什麼發生了嗎?
答案:
可以透過了解 fmt.Println 如何處理值來解釋此行為。根據fmt包文檔,如果操作數實現了“Error”接口,則會呼叫其Error方法將對象轉換為字串以進行列印。由於自訂類型 T 實現了此接口,因此其 Error 方法會傳回“錯誤錯誤”,該錯誤將列印而不是整數值。
解:
列印T 的整數值,您可以使用 fmt.Printf 函數和適當的格式說明符。例如:
fmt.Printf("%d", v) //output: 5
或者,您可以為類型 T 定義自訂 String() 方法,以控制使用 fmt.Println 時的輸出格式:
type T int func (t T) String() string { return strconv.Itoa(int(t)) } func main() { var v interface{} = T(5) fmt.Println(v) //output: 5 }
以上是當自訂類型實作 Go Error 介面時,為什麼 fmt.Println 會印出'bad error”而不是 5?的詳細內容。更多資訊請關注PHP中文網其他相關文章!