内置源代码位置

问题描述 投票:30回答:2

我可以在Go的源代码中找到make的实现。

事实证明,“代码搜索”功能对于语言的这种中心功能几乎没用,我没有办法确定是否应该搜索C函数,Go函数或者什么。

同样在将来我如何在不诉诸此处的情况下弄清楚这种事情? (即:教我钓鱼)

编辑P.S.我已经找到了http://golang.org/pkg/builtin/#make,但是,与其他go包不同,它不包含指向源的链接,大概是因为它位于编译器区域的某个深处。

go
2个回答
26
投票

这样没有make()。简而言之,这种情况正在发生:

  1. 去代码:make(chan int)
  2. 符号替换:OMAKE
  3. 符号typesecking:OMAKECHAN
  4. 代码生成:runtime·makechan

gc,一个去味道的C解析器,根据上下文解析make调用(为了更容易的类型检查)。

此转换在cmd/compile/internal/gc/typecheck.go中完成。

之后,根据有什么符号(例如OMAKECHANmake(chan ...)),在cmd/compile/internal/gc/walk.go中替换相应的运行时调用。在OMAKECHAN的情况下,这将是makechan64makechan

最后,在运行代码时,调用替换函数in pkg/runtime

How do you find this

我倾向于发现这样的事情主要是通过想象这个特定事物可能发生在过程的哪个阶段。在make的情况下,知道make(最基本的包)中没有pkg/runtime的定义,它必须在编译器级别上,并且可能被替换为其他东西。

然后,您必须搜索各种编译器阶段(gc,* g,* l),并及时找到定义。


12
投票

事实上,make是在运行时在Go中实现的不同函数的组合。

这同样适用于appendcopy等其他内置插件。

© www.soinside.com 2019 - 2024. All rights reserved.