我正在阅读一些golang代码的运行时(go1.6.2 linux / amd64),有人可以帮我理解run /(/)文件中getg()函数的基本机制吗?
// getg returns the pointer to the current g.
// The compiler rewrites calls to this function into instructions
// that fetch the g directly (from TLS or from the dedicated register).
func getg() *g
getg()函数如何在这里运行?这个功能的主体是什么?
答案 0 :(得分:4)
请参阅Function signature with no function body以及Function Declarations的规范。
在runtime.getg
的情况下,代码由编译器直接发出。
答案 1 :(得分:1)
它没有被执行 - 完全是因为,如评论中所述
编译器将对此函数的调用重写为指令 直接获取
g
(来自TLS或专用寄存器)。
您可以通过类似
之类的方式获得自己grep -rFw getg /usr/share/go-1.7/src/
编译器看到对runtime.getg()
的调用时发出的代码
是依赖于体系结构的,位于文件
{src}/src/cmd/compile/internal/{arch}/ggen.go
(对于Go 1.7) - 其中{src}
是Go代码的源目录
{arch}
是一个特定于体系结构的目录。
对amd64
说,它是{src}/cmd/compile/internal/amd64/ggen.go
。