码迷,mamicode.com
首页 > 其他好文 > 详细

获取 goroutineID

时间:2020-12-21 11:47:58      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:sprintf   ice   printf   goroutine   信息   not   print   影响   wait   

本文转自鸟窝

获取 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的时候才用它。

获取 goroutineID

标签:sprintf   ice   printf   goroutine   信息   not   print   影响   wait   

原文地址:https://www.cnblogs.com/binHome/p/14143559.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!