Home > Article > Backend Development > Go FAQ says 'No goroutine ID' but we can get it from runtime.Stack. what is it?
go faq answered the question "Why is there no goroutine id?"
goroutines do not have names; they are just anonymous workers. they expose no unique identifier, name, or data structure to the programmer. https://go.dev/doc/faq#no_goroutine_id
I don't believe the "they don't expose unique identifiers" explanation, because it looks like we can get the goroutine id by using runtime.stack().
question
go faq What is the difference between the "unique identifier" in the answer and the goroutine id extracted by runtime.stack?
Why does go faq answer "They don't expose unique identifiers"?
I want to clearly understand the "Why is there no goroutine id?" answer!
runtime.stack() seems to provide the goroutine id. https://go.dev/play/p/5b6fd7c8s6-
package main import ( "bytes" "errors" "fmt" "runtime" "strconv" ) func main() { fmt.Println(goid()) done := make(chan struct{}) go func() { fmt.Println(goid()) done <- struct{}{} }() go func() { fmt.Println(goid()) done <- struct{}{} }() <-done <-done close(done) } var ( goroutinePrefix = []byte("goroutine ") errBadStack = errors.New("invalid runtime.Stack output") ) func goid() (int, error) { buf := make([]byte, 32) n := runtime.Stack(buf, false) buf = buf[:n] // goroutine 1 [running]: ... buf, ok := bytes.CutPrefix(buf, goroutinePrefix) if !ok { return 0, errBadStack } i := bytes.IndexByte(buf, ' ') if i < 0 { return 0, errBadStack } return strconv.Atoi(string(buf[:i])) }
Also, there is another way to get the goroutine id through ebpf.
How to get goroutine id using ebpf
What is the "unique identifier" in Go FAQ and the goroutine id extracted by runtime.Stack the difference?
The FAQ states that goroutines do not expose unique identifiers, names, or data structures to programmers .
The runtime does need a way to identify the Goroutine, but there is no supported way to obtain that identifier.
The Go documentation does not specify the format of the stack trace returned by runtime.Stack or the meaning of the goroutine numbers. The code in the question may retrieve a unique id now, but there is no guarantee that the code will do so in the future.
The above is the detailed content of Go FAQ says 'No goroutine ID' but we can get it from runtime.Stack. what is it?. For more information, please follow other related articles on the PHP Chinese website!