エラー処理のための Go インターフェイスの動作を理解する
Go プログラミング言語では、インターフェイスは型間のコントラクトを定義するための強力なメカニズムを提供します。そのようなコントラクトの 1 つは、型がエラーを表現できるようにする「Error」インターフェイスです。この記事では、カスタム タイプの "Error" メソッドを定義すると予期しない出力が発生する特定のシナリオについて説明します。
問題:
次のコード スニペットを考えてみましょう:
type T int func (t T) Error() string { return "bad error" } func main() { var v interface{} = T(5) fmt.Println(v) //output: bad error, not 5 }
このコードを実行すると、出力は期待される整数値 5 ではなく「悪いエラー」となります。その理由は次のとおりです。これは起こっていますか?
答え:
この動作は、fmt.Println が値を処理する方法を理解することで説明できます。 fmt パッケージのドキュメントによると、オペランドが「Error」インターフェイスを実装している場合、その Error メソッドが呼び出され、オブジェクトを印刷用の文字列に変換します。カスタム型 T はこのインターフェイスを実装しているため、その Error メソッドは「悪いエラー」を返し、整数値の代わりに出力されます。
解決策:
出力するにはT の整数値を指定するには、適切な形式指定子を指定して fmt.Printf 関数を使用できます。例:
fmt.Printf("%d", v) //output: 5
または、fmt.Println:
type T int func (t T) String() string { return strconv.Itoa(int(t)) } func main() { var v interface{} = T(5) fmt.Println(v) //output: 5 }を使用するときに、型 T のカスタム String() メソッドを定義して出力形式を制御できます。
以上がカスタム型が Go Error インターフェイスを実装すると、fmt.Println が 5 ではなく「bad error」を出力するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。