Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 使用新的CASE子句重写AST开关stmt_Go_Abstract Syntax Tree - Fatal编程技术网

Go 使用新的CASE子句重写AST开关stmt

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

我试图在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)
        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]