为了账号安全,请及时绑定邮箱和手机立即绑定

抽象语法树 (AST) 扫描

抽象语法树 (AST) 扫描

Go
慕容3067478 2022-09-19 10:13:55
我正在尝试从 GO AST 中提取函数调用:$ cat main.gopackage mainimport ("fmt"; "go/ast"; "go/token"; "go/parser"; "io/ioutil")func CalledFuncs(n ast.Node) bool {    switch n.(type) {    case *ast.CallExpr:        l := ast.CallExpr(n).Lparen        r := ast.CallExpr(n).Right        fmt.Printf("call %d( ... %d)\n",l,r)    }    return true}func main() {    fset := token.NewFileSet()    src,_ := ioutil.ReadFile("simple.go")    f, _ := parser.ParseFile(fset,">>",src,0)    ast.Inspect(f, CalledFuncs)}但是go编译器抱怨我不能做选角:$ go build -o main main.go# command-line-arguments./main.go:7:26: cannot convert n (type ast.Node) to type ast.CallExpr./main.go:8:26: cannot convert n (type ast.Node) to type ast.CallExpr我在这里可能错过了一些东西。
查看完整描述

1 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

https://golang.org/ref/spec#Type_switches

可以包括一个简短的变量声明。使用该形式时,变量将在每个子句的隐式块的末尾声明。在只列出一种类型的事例的子句中,变量具有该类型;否则,变量具有 .TypeSwitchGuardTypeSwitchCaseTypeSwitchGuard

这意味着您可以执行以下操作:

func CalledFuncs(n ast.Node) bool {

    switch x := n.(type) {

    case *ast.CallExpr:

        l := x.Lparen

        r := x.Rparen

        fmt.Printf("call %d( ... %d)\n", l, r)

    }

    return true

}


查看完整回答
反对 回复 2022-09-19
  • 1 回答
  • 0 关注
  • 54 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信