該程式是:
package main
import (
"fmt"
"reflect"
)
type Request struct {
Method string
Resource string //path
Protocol string
}
type s struct {
ID int
Title string
Request Request
Price float64
Interface interface{}
Exists bool
Many []string
}
func main() {
s := s{}
iterateStruct(s)
}
func iterateStruct(s interface{}) {
e := reflect.ValueOf(s)
for i := 0; i < e.NumField(); i {
varName := e.Type().Field(i).Name
varKind := e.Field(i).Kind()
fmt.Println(e.Type().Field(i).Name)
if varKind == reflect.Struct {
//iterateStruct( <what should be here?>)
}
varType := e.Type().Field(i).Type
varValue := e.Field(i).Interface()
fmt.Printf("%v %v %v %v\n", varName, varKind, varType, varValue)
}
}
使用遞回我想為請求獲取相同的資訊,這是結構的結構部分。
我需要作為引數傳遞什么?我嘗試了各種方法,但我不得不認為這對我來說是很多試驗和錯誤。
uj5u.com熱心網友回復:
這是一個示例,它處理帶有指向結構的指標的欄位、包含結構值的介面等。作為獎勵,這個示例縮進了嵌套結構。
func iterate(v reflect.Value, indent string) {
v = reflect.Indirect(v)
if v.Kind() != reflect.Struct {
return
}
indent = " "
for i := 0; i < v.NumField(); i {
varName := v.Type().Field(i).Name
varKind := v.Field(i).Kind()
varType := v.Type().Field(i).Type
varValue := v.Field(i).Interface()
fmt.Printf("%s%v %v %v %v\n", indent, varName, varKind, varType, varValue)
iterate(v.Field(i), indent)
}
}
像這樣稱呼它:
iterate(reflect.ValueOf(s), "")
https://go.dev/play/p/y1CzbKAUvD_w
uj5u.com熱心網友回復:
試試這個:
if varKind == reflect.Struct {
iterateStruct(e.Field(i).Interface())
}
e.Field(i)回傳Value結構欄位的 。Interface{}將回傳基礎值,因此您可以iterateStruct使用它呼叫。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/405668.html
標籤:
上一篇:如何在構建時使用不同的組態檔?
