增加 Golang 获取 Goroutine ID 的两种实现.

Signed-off-by: chen.yang <chen.yang@yuzhen-iot.com>
This commit is contained in:
chen.yang 2021-08-03 09:34:43 +08:00
parent a8bc6197e8
commit aa10c02bd8
1 changed files with 45 additions and 0 deletions

View File

@ -0,0 +1,45 @@
# Golang 获取 Goroutine ID 的两种实现
Golang获取 goroutine id 的两种实现
众所周知,在 golang 并发编程的一些情况下,需要打印一下 goroutien 的 id 号,怎么来实现呢?下面提供两种方法:
1. 从 runtime.Stack() 方法中获取方法栈,然后从栈帧处获取;
2. 获取运行时 g 指针,反解析出 g 的结构。g 指针时保存在当前 goroutine 的 TLS 对象中。
## 1.解析方法栈
```go
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
}
```
## 2.g 指针方式
因为 go 的版本不同goroutine 的结构也不同,推荐使用第三方库:[petermattis/goid](https://github.com/petermattis/goid)。
```bash
go get -u github.com/petermattis/goid
```
```go
package main
import (
"fmt"
"github.com/petermattis/goid"
)
func main() {
fmt.Println(goid.Get())
}
```