golang 獲取goroutineID
golang從1.4版以後就刪去了獲取協程ID的介面,但有時為除錯方便,還是希望能獲取打印出來
本文介紹的方法是使用runtime.Stack函式從堆疊中取出資訊分析,截取出協程ID
程式碼如下:
func GetGoroutineID() uint64 { b := make([]byte, 64) runtime.Stack(b, false) b = bytes.TrimPrefix(b, []byte("goroutine ")) b = b[:bytes.IndexByte(b, ' ')] n, _ := strconv.ParseUint(string(b), 10, 64) return n }
分析:
首先rumtime.Stack(b,false)會取出堆疊資訊類似放入b中,堆疊資訊類似:
goroutine 1 [running]: main.main() C:/Users/zuma/Desktop/gowork/src/github.com/0990/gotool/main.go:10 +0x74
然後從第一行中取出goroutine後面的數字 1即代表這個協程的ID,so easy!