我正在尝试从 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
可以包括一个简短的变量声明。使用该形式时,变量将在每个子句的隐式块的末尾声明。在只列出一种类型的事例的子句中,变量具有该类型;否则,变量具有 .
TypeSwitchGuard
TypeSwitchCase
TypeSwitchGuard
这意味着您可以执行以下操作:
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 回答
- 0 关注
- 54 浏览
添加回答
举报
0/150
提交
取消