内置源代码位置
Posted
技术标签:
【中文标题】内置源代码位置【英文标题】:Built-In source code location 【发布时间】:2013-09-01 23:53:11 【问题描述】:在 Go 的源代码中我可以在哪里找到 make
的实现。
事实证明,“代码搜索”功能对于这种语言的核心功能几乎毫无用处,而且我没有好的方法来确定我应该搜索 C 函数、Go 函数还是什么。
另外,将来我如何在不求助于这里问的情况下弄清楚这种事情? (即:教我钓鱼)
编辑 附言我已经找到了http://golang.org/pkg/builtin/#make,但与其他 go 包不同,它不包含指向源代码的链接,可能是因为它位于编译器领域的深处。
【问题讨论】:
我不太在乎失去的声誉,但作为一个简短的辩护:阅读代码以了解您正在使用的编程工具是成为一名优秀程序员的核心部分。这个问题涉及“程序员常用的软件工具”,是“编程行业独有的实用、可回答的问题”。缺少源代码不会自动使问题无效,尤其是当我寻找源代码开始时。这是一个主题性的、非主观的问题。 【参考方案1】:没有make()
这样的。简单地说,就是这样:
-
转码:
make(chan int)
符号替换:OMAKE
符号类型检查:OMAKECHAN
代码生成:runtime·makechan
gc
是一个 go 风格的 C 解析器,它根据上下文解析 make
调用(以便于类型检查)。
此转换在cmd/compile/internal/gc/typecheck.go 中完成。
之后,取决于存在的符号(例如,OMAKECHAN
代表 make(chan ...)
),
适当的运行时调用替换为cmd/compile/internal/gc/walk.go。如果是OMAKECHAN
,则为makechan64
或makechan
。
最后,在运行代码时,调用了上述替换函数in pkg/runtime。
你是怎么找到这个的
我倾向于通过想象这个过程的哪个阶段来找到这些东西
特定的事情可能会发生。在make
的情况下,知道没有
在pkg/runtime
(最基本的包)中定义make
,它必须在编译器级别
并且很可能被其他东西取代。
然后您必须搜索各种编译器阶段(gc、*g、*l)并及时找到 定义。
【讨论】:
【参考方案2】:事实上,make
是在运行时用 Go 实现的不同功能的组合。
makeslice 例如make([]int, 10)
makemap 例如make(map[string]int)
makechan 例如make(chan int)
这同样适用于其他内置函数,如 append
和 copy
。
【讨论】:
以上是关于内置源代码位置的主要内容,如果未能解决你的问题,请参考以下文章