Comment on page
4.5.3-1.1 总体流程
类型检查的总体流程定义在
$GCROOT/compile/internal/types2/check.go
文件的方法checkFiles
中,主体代码如下:func (check *Checker) checkFiles(files []*syntax.File) (err error) {
check.initFiles(files)
check.collectObjects()
check.packageObjects()
check.processDelayed(0) // incl. all functions
check.initOrder()
if !check.conf.DisableUnusedImportCheck {
check.unusedImports()
}
check.recordUntyped()
if check.Info != nil {
sanitizeInfo(check.Info)
}
return
}
这里只保留了体现类型检查步骤的代码,删除的部分并不会影响我们对整个流程的理解。这几个方法包含了类型检查的所有重要内容,概括起来可以分为三个部分:
- 1.类型检查准备工作 check.initFiles(files) 与 check.collectObjects()
- 2.类型检查 check.packageObjects() 与 check.processDelayed(0)
- 3.确定全局变量初始化顺序 check.initOrder()
我们接下来对各个部分进行分析。