猿问

Go:尽管文档中存在接口的属性但未定义

我正在编写一个迭代 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)


跃然一笑
浏览 153回答 1
1回答

倚天杖

varValue是interface{}指向BlockStmt实例的类型。您必须使用类型断言来从中获取BlockStmt:blk:=varValue.(*ast.BlockStmt)然后就可以访问了blk.List。
随时随地看视频慕课网APP

相关分类

Go
我要回答