# Golang--获取goroutine id 的两种实现
众所周知,在golang并发编程的一些情况下,需要打印一下goroutien的id号,怎么来实现呢?下面提供两种方法:
1. 从runtime.Stack()方法中获取方法栈,然后从栈帧处获取;
2. 获取运行时g指针,反解析出g的结构。g指针时保存在当前goroutine的TLS对象中。
## 1 解析方法栈
```golang
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
}
```
![goroutine id ](https://raw.githubusercontent.com/cist/cloudimg/main/data/image-20210202161954837.png))
## 2 g指针方式
因为go的版本不同,goroutine的结构也不同,推荐使用第三方库来实现。[petermattis/goid](https://github.com/petermattis/goid)。
go get -u github.com/petermattis/goid
![petermattis/goid](https://raw.githubusercontent.com/cist/cloudimg/main/data/image-20210202163101019.png)
有疑问加站长微信联系(非本文作者)