1

http://play.golang.org/p/xjs-jwMsr7

私はこの機能を持っています

 func (e *MyError) Error() string {
    return fmt.Sprintf("AT %v, %s", e.When, e.What)
 } 

しかし

以下に示すように、私はそれを呼び出したことはありませんが、最終出力で呼び出されるのはなぜですか?

type MyError struct {
    When time.Time
    What string
}

func (e *MyError) Error() string {
    return fmt.Sprintf("AT %v, %s", e.When, e.What)
}

func run() error {
    return &MyError{
        time.Now(), "it didn't work",
    }
}

func main() {
    if err := run(); err != nil {
        fmt.Println(err)
    }
}
4

1 に答える 1

1

fmt.Printlnの他の関数はpkg/fmt、渡されたオブジェクトを分析します。エラーの場合、関数は.Error()渡されたオブジェクトを呼び出し、 によって返された文字列を出力しますError()

詳細はソースを参照してください。コードは次のように述べています。

switch v := p.field.(type) {
case error:
    // ...
    p.printField(v.Error(), verb, plus, false, depth)
    return
// ...
}

渡されたオブジェクトの型は type switch ステートメントでチェックされ、オブジェクトがエラー インターフェイスを実装している場合はv.Error()値として使用されます。

于 2013-10-17T19:42:42.923 に答える