Go 使用新的CASE子句重写AST开关stmt
我试图在Golang AST的switch语句中添加新的caseClause,但一直失败。请您帮助检查如何更改以下案例陈述的以下代码段:Go 使用新的CASE子句重写AST开关stmt,go,abstract-syntax-tree,Go,Abstract Syntax Tree,我试图在Golang AST的switch语句中添加新的caseClause,但一直失败。请您帮助检查如何更改以下案例陈述的以下代码段: case "all": def = pool.All{} func handleSwitch(ss *ast.SwitchStmt) (ast.Node, bool) { expr := make([]ast.Expr, 1) body := make([]ast.Stmt, 1
case "all":
def = pool.All{}
func handleSwitch(ss *ast.SwitchStmt) (ast.Node, bool) {
expr := make([]ast.Expr, 1)
body := make([]ast.Stmt, 1)
bl := &ast.BasicLit{Kind: token.STRING, Value: "\"all\""}
expr = append(expr, bl)
lhs := make([]ast.Expr, 1)
ident := &ast.Ident{Name: "def"}
lhs = append(lhs, ident)
xIdent := &ast.Ident{Name: "pool"}
sIdent := &ast.Ident{Name: "All"}
rhs := make([]ast.Expr, 1)
cl := &ast.CompositeLit {
Type: &ast.SelectorExpr{
X: xIdent,
Sel: sIdent,
},
}
rhs = append(rhs, cl)
as := &ast.AssignStmt{
Lhs: lhs,
Tok: token.ASSIGN,
Rhs: rhs,
}
body = append(body, as)
cc := &ast.CaseClause{
List: expr,
Body: body,
}
newCases = append(newCases, cc)
ss.Body = &ast.BlockStmt{
List: newCases,
}
return ss, true
}
问题是,您使用make(T,N)
分配片,然后使用append
并假设它从第0个位置追加。然而,实际上,append
将在片的末尾添加一个新元素,其前面的任何元素都将保持不变,这种情况意味着nil
,而nil
就是打破AST的原因
请参见代码中的问题:
expr:=make([]ast.expr,1)
格式打印(expr)
// []
bl:=&ast.BasicLit{…}
expr=append(expr,bl)
格式打印(expr)
//[0xc0000a6020]
要解决此问题,您可以执行以下操作之一:
expr:=make([]ast.expr,0)//或[]ast.expr{}
格式打印(expr)
// []
expr=append(expr,bl)
格式打印(expr)
//[0xc00000c0c0]
或:
expr:=make([]ast.expr,1)
格式打印(expr)
// []
expr[0]=bl
格式打印(expr)
//[0xc000114020]
问题在于,您正在使用make(T,N)
分配片,然后使用append
,假设它从第0位追加。然而,实际上,append
将在片的末尾添加一个新元素,其前面的任何元素都将保持不变,这种情况意味着nil
,而nil
就是打破AST的原因
请参见代码中的问题:
expr:=make([]ast.expr,1)
格式打印(expr)
// []
bl:=&ast.BasicLit{…}
expr=append(expr,bl)
格式打印(expr)
//[0xc0000a6020]
要解决此问题,您可以执行以下操作之一:
expr:=make([]ast.expr,0)//或[]ast.expr{}
格式打印(expr)
// []
expr=append(expr,bl)
格式打印(expr)
//[0xc00000c0c0]
或:
expr:=make([]ast.expr,1)
格式打印(expr)
// []
expr[0]=bl
格式打印(expr)
//[0xc000114020]