首頁 > 後端開發 > Golang > 當自訂類型實作 Go Error 介面時,為什麼 fmt.Println 會印出'bad error”而不是 5?

當自訂類型實作 Go Error 介面時,為什麼 fmt.Println 會印出'bad error”而不是 5?

Barbara Streisand
發布: 2024-12-22 11:37:13
原創
182 人瀏覽過

Why Does fmt.Println Print

了解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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板