4.5.3-1.3a 总体介绍
func (check *Checker) packageObjects() {
// 将 Object 对象按照申明的顺序排序
objList := make([]Object, len(check.objMap))
i := 0
for obj := range check.objMap {
objList[i] = obj
i++
}
sort.Sort(inSourceOrder(objList))
// 对于已经完成类型检查的对象,收集该对象的方法。因为 check.Files 可能被调用多次,所以第一次调用时该 for 循环不会有任何作用
for _, obj := range objList {
if obj, _ := obj.(*TypeName); obj != nil && obj.typ != nil {
check.collectMethods(obj)
}
}
var aliasList []*TypeName
// 步骤一
for _, obj := range objList {
if tname, _ := obj.(*TypeName); tname != nil && check.objMap[tname].tdecl.Alias {
// 如果是类型别名,则收集起来在步骤二中处理
aliasList = append(aliasList, tname)
continue
}
// 对非类型别名的对象进行类型检查
check.objDecl(obj, nil)
}
// 步骤二:对类型别名进行类型检查
for _, obj := range aliasList {
check.objDecl(obj, nil)
}
check.methods = nil // 释放内存
}
最后更新于