fmt.Println 中Error() 相對於String() 的優先權
在Go 中,當使用fmt.Println 物件列印時, String () 方法通常用於將物件轉換為字串以進行列印。但是,在某些情況下,Error() 方法優先於 String()。
此行為是由 fmt.Println 的實作定義的。套件文檔指出,如果一個物件實作了錯誤接口,則將呼叫 Error() 方法將該物件轉換為字串。然後根據動詞(如果有)的要求格式化該字串。
Error() 的實作比 String() 具有更高的優先權,因為在實務上錯誤被認為更重要。這可以確保清楚地顯示任何錯誤,即使定義了自訂 String() 方法也是如此。
為了說明此概念,請考慮以下範例:
package main import "fmt" type Person struct { Name string Age int } func (p *Person) String() string { return fmt.Sprintf("%v (%v years)", p.Name, p.Age) } func (p *Person) Error() string { return fmt.Sprintf("Failed") } func main() { a := &Person{"Arthur Dent", 42} z := &Person{"Zaphod Beeblebrox", 9001} fmt.Println(a, z) }
在此範例中,兩者Person 型別實作 String() 和 Error() 方法。但是,當使用fmt.Println 列印物件時,會呼叫Error() 方法而不是String(),導致以下輸出:
Failed Failed
這是因為Error() 的優先權高於fmt. Println 中的String(),確保清晰顯示任何錯誤。
因此,在使用同時實作 Error() 和 String() 的物件時,重要的是考慮所需的輸出並相應地調整實作。
以上是為什麼 Go 中 `fmt.Println` 優先考慮 `Error()` 而不是 `String()`?的詳細內容。更多資訊請關注PHP中文網其他相關文章!