我最近正在研究 Thorsten Ball 的“用 Go 编写解释器”,并遇到了这种语法
program.Statements[0].(*ast.ExpressionStatement)
。任何人都可以 ELI5 这是在做什么吗?附加背景:
type Program struct {
Statements []Statement
}
type Statement interface {
Node
statementNode()
}
type Node interface {
TokenLiteral() string
String() string
}
假设
program
属于 Program
类型,program.Statements[0]
属于 Statement
类型,因此 program.Statements[0].(*ast.ExpressionStatement)
断言它确实是 *ast.ExpressionStatement
,否则会使程序出现恐慌。
你可以写
s := program.Statements[0]
es := s.(*ast.ExpressionStatement)
而不是
es := program.Statements[0].(*ast.ExpressionStatement)