package runtime import ( "reflect" "unsafe" ) var ( offsetGoid uintptr offsetSched uintptr ) func init() { pg, err := TypeByString("*runtime.g") if err != nil { return } if pg.Kind() != reflect.Ptr { return } g := pg.Elem() if g.Kind() != reflect.Struct { return } goid, ok := g.FieldByName("goid") if !ok { return } sched, ok := g.FieldByName("sched") if !ok { return } offsetGoid = goid.Offset offsetSched = sched.Offset } //go:linkname mcall runtime.mcall //go:nosplit func mcall(func(uintptr)) //go:linkname gogo runtime.gogo //go:nosplit func gogo(uintptr) func GOID() (goid int64) { mcall(func(g uintptr) { id := unsafe.Pointer(g + offsetGoid) goid = *(*int64)(id) sched := g + offsetSched gogo(sched) }) return }