内置源代码位置

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,则为makechan64makechan

最后,在运行代码时,调用了上述替换函数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)

这同样适用于其他内置函数,如 appendcopy

【讨论】:

以上是关于内置源代码位置的主要内容,如果未能解决你的问题,请参考以下文章

内置函数

laravel 5.5 内置鉴权数据库表参考位置

内置函数

D15内置函数和魔术方法

js如何判断网页是在手机QQ内置浏览器中打开?求代码!

day14 , day15--内置函数