ホームページ > バックエンド開発 > Golang > カスタム型に対して `fmt.Println()` が `String()` よりも `Error()` を優先するのはなぜですか?

カスタム型に対して `fmt.Println()` が `String()` よりも `Error()` を優先するのはなぜですか?

Patricia Arquette
リリース: 2024-11-27 04:20:13
オリジナル
571 人が閲覧しました

Why Does `fmt.Println()` Prefer `Error()` Over `String()` for Custom Types?

fmt.Println() の Error() メソッドが String() メソッドを無効にする理由

String() と Error の両方を実装する場合カスタム型の () メソッドを使用すると、 fmt.Println() が Error() メソッドを優先する状況が発生する可能性があります。 String() メソッド。

これは、オブジェクトをフォーマットするために呼び出すメソッドを選択するときに fmt パッケージが階層を採用しているためです。パッケージのドキュメントによると、次の操作順序が適用されます。

  1. オブジェクトが Formatter インターフェイスを実装している場合、その Format() メソッドが呼び出されます。
  2. If the %# v フォーマットが使用され、オブジェクトが GoStringer インターフェースを実装すると、その GoString() メソッドが呼び出されます。
  3. オブジェクトがエラーを実装する場合インターフェイスの場合、その Error() メソッドはオブジェクトを文字列に変換するために使用されます。
  4. オブジェクトが String() メソッドを実装している場合、その String() メソッドが呼び出されます。

この階層ではエラー インターフェイスが String() インターフェイスよりも上位にランクされているため、特定のオブジェクトに対して両方のメソッドが実装されている場合、fmt.Println() は Error() メソッドを優先します。これは、エラーは通常、より緊急の対応が必要であり、明確かつ簡潔な方法で速やかに伝える必要があるためです。

ここで提供されている例では、Person 型は String() メソッドと Error() メソッドの両方を実装しています。ただし、Error() メソッドは単に文字列「Failed」を返すだけですが、String() メソッドはその人物に関するより有益な説明を提供します。 fmt.Println() を使用して Person タイプのインスタンスを出力する場合、前述の階層により Error() メソッドが String() メソッドよりも優先されるため、「失敗」メッセージのみが表示されます。

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

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