增加 Golang 获取 Goroutine ID 的两种实现.
Signed-off-by: chen.yang <chen.yang@yuzhen-iot.com>
This commit is contained in:
parent
a8bc6197e8
commit
aa10c02bd8
|
@ -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())
|
||||
}
|
||||
```
|
Loading…
Reference in New Issue