Go で `fmt.Println` が `String()` よりも `Error()` を優先するのはなぜですか?

DDD
リリース: 2024-11-20 20:09:16
オリジナル
524 人が閲覧しました

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

fmt.Println における String() に対する Error() の優先順位

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)
}
ログイン後にコピー

この例では、両方の人物タイプは String() メソッドと Error() メソッドを実装します。ただし、オブジェクトが fmt.Println を使用して印刷される場合、String() の代わりに Error() メソッドが呼び出され、次の出力が得られます。

Failed Failed
ログイン後にコピー

これは、Error() の優先順位が Error() よりも高いためです。 fmt.Println の String() を使用して、エラーが明確に表示されるようにします。

したがって、両方を実装するオブジェクトを操作する場合は、 Error() と String() では、目的の出力を考慮し、それに応じて実装を調整することが重要です。

以上がGo で `fmt.Println` が `String()` よりも `Error()` を優先するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート