4.5.1 类型检查逻辑 - 包加载器
最后更新于
这有帮助吗?
最后更新于
这有帮助吗?
go 编译器一次编译的最大单元是一个包,输出的结果叫着对象文件(Object File),go 定义了自己的对象文件格式,并以.a
或者.o
为后缀存在于文件系统中。在$GOROOT/pkg/$OS_$ARCH/
目录下就包含了所有标准库的对象文件,例如 linux 系统该目录为:$GOROOT/pkg/linux_amd64
.
加载器在编译阶段解决包依赖问题,其任务就是通过包名找到对应的对象文件,然后将其解析成为上文提到的对象。加载器可以有各种实现,其接口定义在文件$GCROOT/compile/internal/types2/api.go
中:
两个接口的区别是方法ImporterFrom
通过指定目标目录的方式来支持, 而Importer
无法支持,保留Importer
接口是为了兼容性考虑,ImportMode 当前没有用途。加载器的实现在$GCROOT/compile/internal/noder/import.go
中,抛开具体细节,其代码框架为:
可见Import
只是简单地调用ImportFrom
方法,而后者负责整个加载解析逻辑。加载器配置在中,并在类型检查的入口函数check2()
中进行初始化,该函数在文件$GCROOT/compile/internal/noder/irgen.go
中。