github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/prepare/12_cgo/goid/main.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "runtime" 6 "strconv" 7 "strings" 8 "sync" 9 ) 10 11 func GoID() int { 12 var buf [1024]byte 13 n := runtime.Stack(buf[:], false) 14 idField := strings.Fields(strings.TrimPrefix(string(buf[:n]), "goroutine "))[0] 15 id, err := strconv.Atoi(idField) 16 if err != nil { 17 panic(fmt.Sprintf("cannot get goroutine id: %v", err)) 18 } 19 return id 20 } 21 func main() { 22 fmt.Println("main", GoID()) 23 var wg sync.WaitGroup 24 for i := 0; i < 10; i++ { 25 i := i 26 wg.Add(1) 27 go func() { 28 defer wg.Done() 29 fmt.Println(i, GoID()) 30 }() 31 } 32 wg.Wait() 33 }