ホームページ >バックエンド開発 >Golang >両方が実装されている場合、なぜ Go の `fmt` パッケージは `String()` よりも `Error()` を優先するのでしょうか?

両方が実装されている場合、なぜ Go の `fmt` パッケージは `String()` よりも `Error()` を優先するのでしょうか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-28 10:58:11167ブラウズ

Why Does Go's `fmt` Package Prefer `Error()` Over `String()` When Both Are Implemented?

Go における String() に対する Error() の優先度

Go では、fmt パッケージは型に基づいて値の出力を処理します。オブジェクトが Error() メソッドと String() メソッドの両方を実装している場合、Error() メソッドが優先されます。この動作は、エラー処理を優先する fmt の実装に起因します。

fmt パッケージのドキュメントによると、オペランドがエラー インターフェイスを実装している場合、Error() メソッドが呼び出され、オブジェクトを文字列に変換する前にオブジェクトが文字列に変換されます。任意の書式設定を適用します。このロジックは、このロジックを実装するオペランドに対してデフォルトで呼び出される 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)
}

出力:

Failed Failed

この例では、Person 型が String() と String() の両方を実装しているにもかかわらず、 Error() メソッドが優先されるため、fmt.Println 関数は両方の人に「失敗」を出力します。これは、エラーはより重大であると考えられており、即時の対応が必要であるためです。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。