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  }