4.5.2-1 全局作用域
简单地说,该部分的任务就是将语言的内置符号初始化,并注册到全局作用域中。初始化逻辑在$GCROOT/compile/internal/types2/universe.go
中,通过init
函数在编译器启动时自动初始化:
该函数很清晰地表达了整个初始化过程,我们知道Scope
中存放的是Object
对象,所以各初始化函数的任务就是创建不同类型的Object
对象并注册到全局变量Universe
中。我们简单描述一下各个函数的任务:
defPredeclaredTypes 注册基本类型,例如 int8, float32, bool 等,包括前文提到的 Untyped 类型,该函数会为每种类型创建一个
TypeName
类型的 Object 对象。 值得注意的是该方法还初始化了 error 类型,初始化代码如下:
上述代码相当于往 Universe 中注册了如下的接口类型:
而这正是 go 中对 error 类型的要求:实现Error() string
方法,所以 error 类型的接口并没有在任何地方进行显示地申明,而是在此处通过代码创建的。
defPredeclaredConsts 注册语言内置的常量,一共有三个:true, false, iota. 为每个常量创建一个
Const
类型的 Object 对象。defPredeclaredNil 注册
nil
, 其对应的是Nil
类型的 Object 对象。defPredeclaredFuncs 注册内置函数,例如 append, new, panic 等,每个内置函数对应一个
Builtin
类型的 Object 对象。defPredeclaredComparable 与注册 error 类型相似,该方法注册了另一个隐式接口 comprable, 该接口是泛型的预定义 constraint. 例如可以如下方式使用该接口:
最后更新于