22
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

Go で実行中の行数、ファイル名の取得

Go では FILELINE はありません。
これは、プリプロセッサを省いてコンパイルスピードを早めたいかららしいです。

しかし、 Go 標準の log モジュールは 以下のようにフラグでこれらを出力できます。

package main
import "log"

func main() {
  // どちらかを指定
  log.setFlags(log.Llongfile) // full file name and line number: /a/b/c/d.go:23
  log.setFlags(log.Lshortfile) // final file name element and line number: d.go:23. overrides Llongfile
  log.Println("debug log")
}

自分でちょっとした logger を組みたいときに、これらの情報をどう取得するかを知りたかったので log のソースを読んだら、 runtime モジュールを使えば良いことがわかりました。

package main

import (
  "runtime"
  "fmt"
)

func main() {
  // func Caller(skip int) (pc uintptr, file string, line int, ok bool)
  fmt.Println(runtime.Caller(1))
}

Caller の引数は、どこまでスタックを遡るかなので、メソッドを呼び出してる行や、そのメソッドを呼び出すメソッドを呼び出す行の番号など、数字を増やすと取得できます。

自前 logger を作るときとかにどうぞ。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
22
Help us understand the problem. What are the problem?