diff --git a/Software/Development/Language/Go/Basic/Goroutine/Golang_获取_Goroutine_ID_的两种实现.md b/Software/Development/Language/Go/Basic/Goroutine/Golang_获取_Goroutine_ID_的两种实现.md new file mode 100644 index 0000000..d6384a5 --- /dev/null +++ b/Software/Development/Language/Go/Basic/Goroutine/Golang_获取_Goroutine_ID_的两种实现.md @@ -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()) +} +```