我正在编写一个迭代 AST(抽象语法树)的程序。当我执行以下代码时:val := reflect.Indirect(reflect.ValueOf(currStatement))for i := 0; i < val.NumField(); i++ { varName := val.Type().Field(i).Name varType := val.Type().Field(i).Type varValue := val.Field(i).Interface() if (varName == "Body") { fmt.Printf("%v %v %v\n", varName,varType,varValue) }}fmt.Println()我得到以下输出:Body *ast.BlockStmt &{2795 [0xc0001044c0] 2867} 这表明val.Field(i).Interface()是 type *ast.BlockStmt。但是,根据此处的文档(https://pkg.go.dev/go/ast#BlockStmt):很明显,BlockStmt有属性List。但是,当我在循环中运行以下代码行for以提取属性的值时List(我最终将对其进行迭代):fmt.Printf("%v %v %v\n", varName,varType,varValue.List)我收到以下错误:varValue.List undefined (type interface {} is interface with no methods)
1 回答

倚天杖
TA贡献1828条经验 获得超3个赞
varValue
是interface{}
指向BlockStmt
实例的类型。您必须使用类型断言来从中获取BlockStmt
:
blk:=varValue.(*ast.BlockStmt)
然后就可以访问了blk.List
。
- 1 回答
- 0 关注
- 124 浏览
添加回答
举报
0/150
提交
取消