4.5.3-1.3c 求值表达式的类型检查
func (check *Checker) exprInternal(x *operand, e syntax.Expr, hint Type) exprKind {
switch e := e.(type) {
case *syntax.Name:
// 对标识符进行类型检查,如果该标识符已经完成了类型检查,则递归终止,否则递归进行检查
check.ident(x, e, nil, false)
case *syntax.BasicLit:
// 基本类型都是常量表达式,设置常量值。
x.setConst(e.Kind, e.Value)
case *syntax.FuncLit:
// 函数字面量是形如 func() {} 的表达式,先对函数类型进行检查,再将函数体的检查推入 delayed 队列
if sig, ok := check.typ(e.Type).(*Signature); ok {
decl := check.decl
iota := check.iota
check.later(func() {
check.funcBody(decl, "<function literal>", sig, e.Body, iota)
})
x.mode = value
x.typ = sig
}
}
}最后更新于