首頁  >  文章  >  後端開發  >  為什麼 Go 中 `fmt.Println` 優先考慮 `Error()` 而不是 `String()`?

為什麼 Go 中 `fmt.Println` 優先考慮 `Error()` 而不是 `String()`?

DDD
DDD原創
2024-11-20 20:09:16527瀏覽

Why Does `fmt.Println` Prioritize `Error()` over `String()` in Go?

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

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