首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >抽象语法树扫描

抽象语法树扫描
EN

Stack Overflow用户
提问于 2021-08-01 13:58:16
回答 1查看 174关注 0票数 0

我正在尝试从go AST提取函数调用

代码语言:javascript
复制
$ cat main.go
package main
import ("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编译器抱怨说我不能进行转换:

代码语言:javascript
复制
$ 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

我可能漏掉了什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-01 14:27:23

开关

TypeSwitchGuard可能包括一个短变量声明。当使用该表单时,变量将在TypeSwitchCase末尾的每个子句的隐块中声明。在用大小写列出一种类型的子句中,变量具有该类型;否则,变量具有TypeSwitchGuard中表达式的类型。

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

代码语言:javascript
复制
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
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68611125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档