golangの練習で、いろいろ関数を書いている。
関数を呼び出していると何を実行しているのかわかりにくくなってきたので、logを出そうかと考えた。
が、別に関数の名前だけ表示すればいいや、とC/C++のプリプロセッサみたいなものを使って出力させようとした。
が、golangにはプリプロセッサのようなものは無いらしい。まあ、わからんでもない。プリプロセッサは強力すぎて訳がわからないことまでできてしまいがちだからなぁ。
スタックトレース的なものはあるので、あちこち参考にしながら私も書いてみた。
01: package dbg 02: 03: import ( 04: "fmt" 05: "runtime" 06: "strings" 07: ) 08: 09: //Trace trace log 10: func Trace() { 11: print("", "") 12: } 13: 14: //Head function header 15: func Head() { 16: banner := strings.Repeat("*", 30) 17: print("\n\n"+banner+"\n", "\n"+banner) 18: } 19: 20: func print(head string, tail string) { 21: upc, fname, fline, _ := runtime.Caller(2) 22: fmt.Printf("%s[%s:%d]%s()%s\n", head, fname, fline, runtime.FuncForPC(upc).Name(), tail) 23: }
関数の頭で呼んだときは派手派手にしたかったのでHead()とTrace()にわけた。
まあ、Traceっていっても名前を出すだけなんだけどね。
オーバーライドのようなものは無いみたいで、引数を構造体にしてデフォルト引数を実現するような技が出てきた。今回は使ってないがそういうのもあるということで。
あと、文字列なのでポインタ型で渡した方がいいのかと思ったが、string型はどうなのだろうか?
emptyをconstにしようとしたけど失敗。よくわからん。。01: package dbg 02: 03: import ( 04: "fmt" 05: "runtime" 06: "strings" 07: ) 08: 09: var banner = strings.Repeat("*", 30) 10: var head = "\n\n" + banner + "\n" 11: var tail = "\n" + banner 12: 13: //Trace trace log 14: func Trace() { 15: empty := "" 16: print(&empty, &empty) 17: } 18: 19: //Head function header 20: func Head() { 21: print(&head, &tail) 22: } 23: 24: func print(head *string, tail *string) { 25: upc, fname, fline, _ := runtime.Caller(2) 26: fmt.Printf("%s[%s:%d]%s()%s\n", *head, fname, fline, runtime.FuncForPC(upc).Name(), *tail) 27: }
スタックに場所を確保する程度の重荷だろうから、もうこのままでいいや。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。