获取 goroutineID
本文转自鸟窝
获取 goroutineID
package main
import (
"fmt"
"runtime"
"strconv"
"strings"
"sync"
)
func GoID() int {
var buf [64]byte
n := runtime.Stack(buf[:], false)
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
}
func main() {
fmt.Println("main", GoID())
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
i := i
wg.Add(1)
go func() {
defer wg.Done()
fmt.Println(i, GoID())
}()
}
wg.Wait()
}
它利用runtime.Stack
的堆栈信息。runtime.Stack(buf [\]byte, all bool) int
会将当前的堆栈信息写入到一个slice中,堆栈的第一行为goroutine #### […
,其中####
就是当前的gororutine id,通过这个花招就实现GoID
方法了。
但是需要注意的是,获取堆栈信息会影响性能,所以建议你在debug的时候才用它。
Songzhibin