在golang源代码中,有一些代码如:
MOVL (g_sched+gobuf_sp)(SI), SP // sp = m->g0->sched.sp
在runtime/stubs.go
我找到了
func getg() *g
但我找不到getg
函数或g
结构,它在哪里?
答案 0 :(得分:1)
结构位于runtime2.go
。
type g struct { // Stack parameters. // stack describes the actual stack memory: [stack.lo, stack.hi). // stackguard0 is the stack pointer compared in the Go stack growth prologue.
您可以使用godef
快速自行回答类似的问题。
该功能的评论描述了它的工作原理:
编译器将对此函数的调用重写为指令 直接获取g(来自TLS或专用寄存器)。
要了解编译器如何执行此操作,请检查cmd/compile/internal/gc/typecheck.go
:
if ..... && n.Left.Sym.Name == "getg" { ...