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()

我们接下来对各个部分进行分析。

最后更新于