1

Go withにログインするとlog.Println、頻繁に

2012/05/13 16:45:50 evaluating %v(PANIC=3)

何が間違っているのかを判断する方法がわかりません。ロギングの失敗によってプログラムがクラッシュしないようfmt.Printlnに、自分のStringerインターフェイス実装の1つによって生成されたパニックがどこかで発生したと思います。

何が起こっているのかをどうやって理解するのですか?この誤ったメッセージが表示されるのはなぜですか?

4

2 に答える 2

3

そうです、Stringメソッドにパニックがあります。logしかし、それはパッケージとは何の関係もありません。Printlnを使用し%v、メソッド%vを実行することを意味しStringます。メソッドでパニックが発生すると、Stringが呼び出されますcatchPanic。ここで、出力3にパニックの値が表示されます。

于 2012-05-13T09:29:15.287 に答える
1

検査するコードがなければ、言うのは難しいです。デバッグするには、おそらく に置き換えlog.Println("evaluating", foo)てみてくださいlog.Printf("evaluating %#v\n", foo)。動作が少し異なります。

package main

import "log"

type t int

func (t) String() string {
    panic(3)
}

func main() {
    var v t = 42
    log.Println("evaluating", v)
    log.Printf("evaluating %#v\n", v)
}

$ go run main.go
2012/05/13 11:19:49 evaluating %v(PANIC=3)
2012/05/13 11:19:49 evaluating 42
$ 
于 2012-05-13T09:22:36.800 に答える