Go の `fmt` パッケージが印刷時に `String()` よりも `Error()` を優先するのはなぜですか?

Barbara Streisand
リリース: 2024-11-24 02:33:10
オリジナル
886 人が閲覧しました

Why Does Go's `fmt` Package Prioritize `Error()` Over `String()` When Printing?

String() に対する Error() の優先順位

Go では、fmt パッケージが印刷操作を処理します。オブジェクトに Error() メソッドと String() メソッドの両方が実装されている場合、印刷目的では Error() メソッドが String() よりも優先されます。

この優先順位は、エラーの実際的な重要性に由来しています。通常、エラーは一般的な文字列表現よりも伝えることが重要です。したがって、オブジェクトがエラー インターフェイスを実装している場合、その Error() メソッドがフォーマットと印刷に使用されます。

この動作は、fmt のパッケージのドキュメントに記載されています。次の抜粋では優先順位について説明しています。

3. If an operand implements the error interface, the Error method will be invoked to convert the object to a string, which will then be formatted as required by the verb (if any).
4. If an operand implements method String() string, that method will be invoked to convert the object to a string, which will then be formatted as required by the verb (if any).
ログイン後にコピー

次のコードを考えてみましょう。

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

この例では、 type は String() メソッドと Error() メソッドの両方を実装します。 fmt.Println() 関数が呼び出されると、String() の代わりに Error() メソッドが呼び出され、次の出力が得られます。

Failed Failed
ログイン後にコピー

これは、String() に対する Error() の優先順位を示しています。 ) Go の印刷機能。

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

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