ホームページ >バックエンド開発 >Golang >カスタム型が Go Error インターフェイスを実装すると、fmt.Println が 5 ではなく「bad error」を出力するのはなぜですか?

カスタム型が Go Error インターフェイスを実装すると、fmt.Println が 5 ではなく「bad error」を出力するのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-22 11:37:13115ブラウズ

Why Does fmt.Println Print

エラー処理のための 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 サイトの他の関連記事を参照してください。

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