如何识别goroutine?

如何识别goroutine?,go,goroutine,Go,Goroutine,比如说我有一个关于一堆goroutine的stacktrace,例如。g、 : goroutine 5633 [select]: net/http.(*persistConn).writeLoop(0xc21303ac00) /usr/lib/go/src/pkg/net/http/transport.go:791 +0x271 created by net/http.(*Transport).dialConn /usr/lib/go/src/pkg/net/http/trans

比如说我有一个关于一堆goroutine的stacktrace,例如。g、 :

goroutine 5633 [select]:
net/http.(*persistConn).writeLoop(0xc21303ac00)
    /usr/lib/go/src/pkg/net/http/transport.go:791 +0x271
created by net/http.(*Transport).dialConn
    /usr/lib/go/src/pkg/net/http/transport.go:529 +0x61e
在我的例子中,一组goroutine为一个独特的特定于应用程序的对象提供服务,我想看看与特定对象相关的goroutine的stacktrace。我有数百个特定于应用程序的对象,因此我得到了数百个相同的goroutine

如何将日志与stacktrace中的goroutines关联起来?似乎没有办法在堆栈跟踪中标识当前goroutine,也没有办法命名goroutine,这样我就可以在堆栈跟踪中看到特定的值

PS

我已经阅读了Go邮件列表上相关的why why you Way to do it posts,因此我正在寻找替代方案/黑客/解决方法(希望不要每隔一行就用日志调用来散布代码)。

a是可能的,并且涉及一小段C代码

戈伊德
我对Golang很熟悉,但对C不太熟悉。你能解释一下GetGoID中的语句是做什么的吗?“ret=g->goid;USED(&ret);”我认为这不再有效了-
#include <runtime.h>
void ·GetGoID(int32 ret) {
    ret = g->goid;
    USED(&ret);
}
package main
import (
    "fmt"
    "sync"
)
// Declaration is required
func GetGoID() int32
func main() {
    var wg sync.WaitGroup
    f := func() {
        wg.Add(1)
        go func() {
            fmt.Printf("goroutine %d\n", GetGoID())
            wg.Done()
        }()
    }
    for i := 0; i < 10; i++ {
        f()
    }
    wg.Wait()
}
$ go build
$ ./example
goroutine 20
goroutine 21
goroutine 22
goroutine 23
goroutine 24
goroutine 25
goroutine 26
goroutine 27
goroutine 28
goroutine 29