Links
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. 1.
    类型检查准备工作 check.initFiles(files) 与 check.collectObjects()
  2. 2.
    类型检查 check.packageObjects() 与 check.processDelayed(0)
  3. 3.
    确定全局变量初始化顺序 check.initOrder()
我们接下来对各个部分进行分析。