Golang–获取goroutine id 的两种实现
众所周知,在golang并发编程的一些情况下,需要打印一下goroutien的id号,怎么来实现呢?下面提供两种方法:
- 从runtime.Stack()方法中获取方法栈,然后从栈帧处获取;
- 获取运行时g指针,反解析出g的结构。g指针时保存在当前goroutine的TLS对象中。
1 解析方法栈
func GoID() int {
var buf [64]byte
n := runtime.Stack(buf[:], false)
// 得到id字符串
idField := strings.Fields(strings.TrimPrefix(string(buf[:n]), "goroutine "))[0]
id, err := strconv.Atoi(idField)
if err != nil {
panic(fmt.Sprintf("cannot get goroutine id: %v", err))
}
return id
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ibqLRKU7-1612254762824)(https://raw.githubusercontent.com/cist/cloudimg/main/data/image-20210202161954837.png)]
2 g指针方式
因为go的版本不同,goroutine的结构也不同,推荐使用第三方库来实现。petermattis/goid。
go get -u github.com/petermattis/goid
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nTkzVkSR-1612254762828)(https://raw.githubusercontent.com/cist/cloudimg/main/data/image-20210202163101019.png)]
中…(img-nTkzVkSR-1612254762828)]