我正在撰寫一個迭代 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。但是,根據此處的檔案(
很明顯,BlockStmt有屬性List。但是,當我在回圈中運行以下代碼行for以提取屬性的值時List(我最終將對其進行迭代):
fmt.Printf("%v %v %v\n", varName,varType,varValue.List)
我收到以下錯誤:
varValue.List undefined (type interface {} is interface with no methods)
uj5u.com熱心網友回復:
varValue是interface{}指向BlockStmt實體的型別。您必須使用型別斷言來從中獲取BlockStmt:
blk:=varValue.(*ast.BlockStmt)
然后就可以訪問了blk.List。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/422105.html
標籤:
下一篇:GoLang列印結構中變數的值
