首頁 >後端開發 >Golang >為什麼對於自訂類型,'fmt.Println()”更喜歡'Error()”而不是'String()”?

為什麼對於自訂類型,'fmt.Println()”更喜歡'Error()”而不是'String()”?

Patricia Arquette
Patricia Arquette原創
2024-11-27 04:20:13528瀏覽

Why Does `fmt.Println()` Prefer `Error()` Over `String()` for Custom Types?

為什麼Error() 方法會覆寫fmt.Println() 中的String() 方法

當你同時實作String() 和Error 時對於自訂類型的() 方法,您可能會遇到fmt.Println() 優先考慮Error()方法而不是 String() 的情況

這是因為 fmt 套件在選擇呼叫哪個方法來格式化物件時採用層次結構。根據套件文檔,應用以下操作順序:

  1. 如果物件實作了 Formatter 接口,則會呼叫其 Format() 方法。
  2. 如果 %#使用 v 格式且物件實作了 GoStringer 接口,則會呼叫其 GoString() 方法。
  3. 如果物件實現了 error 接口,則其Error() 方法將用於將物件轉換為字串。
  4. 如果物件實作了 String() 方法,則會呼叫其 String() 方法。

因為在此層次結構中,錯誤接口的排名高於String() 接口,如果給定對象實現了這兩種方法,則fmt.Println() 將優先考慮Error()方法。這是因為錯誤通常需要更緊急的關注,並且應該以清晰簡潔的方式及時傳達。

在提供的範例中,Person 類型實作了 String() 和 Error() 方法。但是,Error() 方法僅傳回字串“Failed”,而 String() 方法則提供有關此人的更豐富的資訊描述。當您使用 fmt.Println() 列印 Person 類型的實例時,您只會看到「失敗」訊息,因為由於上述層次結構,Error() 方法優先於 String() 方法。

以上是為什麼對於自訂類型,'fmt.Println()”更喜歡'Error()”而不是'String()”?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn