2 回答

TA貢獻(xiàn)1793條經(jīng)驗(yàn) 獲得超6個贊
這樣的事情行得通嗎?可能需要根據(jù)您的特定結(jié)構(gòu)和用例進(jìn)行一些調(diào)整(是否要打印接口{},其中值實(shí)際上是一個結(jié)構(gòu)等)
package main
import (
"fmt"
"reflect"
)
func printStruct(t interface{}, prefix string) {
s := reflect.Indirect(reflect.ValueOf(t))
typeOfT := s.Type()
for i := 0; i < s.NumField(); i++ {
f := s.Field(i)
fmt.Printf("%s%s %s\n", prefix, typeOfT.Field(i).Name, typeOfT.Field(i).Type)
switch f.Type().Kind() {
case reflect.Struct, reflect.Ptr:
fmt.Printf("%s{\n", prefix)
printStruct(f.Interface(), prefix+"\t")
fmt.Printf("%s}\n", prefix)
}
}
}
然后,對于這個結(jié)構(gòu):
type C struct {
D string
}
type T struct {
A int
B string
C *C
E interface{}
F map[string]int
}
t := T{
A: 23,
B: "hello_world",
C: &C{
D: "pointer",
},
E: &C{
D: "interface",
},
}
你得到:
A int
B string
C *main.C
{
D string
}
E interface {}
F map[string]int
Go Playground 鏈接:https://play.golang.org/p/IN8-fCOe0OS

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超6個贊
除了使用反射,我看不到其他選擇
func Sprint(v interface{}) string {
t := reflect.Indirect(reflect.ValueOf(v)).Type()
fieldFmt := ""
for i := 0; i < t.NumField(); i++ {
field := t.Field(i)
fieldFmt += "\t" + field.Name + " " + field.Type.Name() + "\n"
}
return "type " + t.Name() + " struct {\n" + fieldFmt + "}"
}
請注意,盡管此函數(shù)沒有驗(yàn)證/檢查,并且可能會對非結(jié)構(gòu)輸入造成恐慌。
編輯:去游樂場:https://play.golang.org/p/5RiAt86Wj9F
哪些輸出:
type Foo struct {
Bar string
Other int
}
- 2 回答
- 0 關(guān)注
- 154 瀏覽
添加回答
舉報