我正在編寫一個迭代 AST(抽象語法樹)的程序。當(dāng)我執(zhí)行以下代碼時: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。但是,根據(jù)此處的文檔(https://pkg.go.dev/go/ast#BlockStmt):很明顯,BlockStmt有屬性List。但是,當(dāng)我在循環(huán)中運行以下代碼行for以提取屬性的值時List(我最終將對其進(jìn)行迭代):fmt.Printf("%v %v %v\n", varName,varType,varValue.List)我收到以下錯誤:varValue.List undefined (type interface {} is interface with no methods)
1 回答

倚天杖
TA貢獻(xiàn)1828條經(jīng)驗 獲得超3個贊
varValue
是interface{}
指向BlockStmt
實例的類型。您必須使用類型斷言來從中獲取BlockStmt
:
blk:=varValue.(*ast.BlockStmt)
然后就可以訪問了blk.List
。
- 1 回答
- 0 關(guān)注
- 97 瀏覽
添加回答
舉報
0/150
提交
取消