由於文章由markdown的方式編寫, 部分鏈接與圖片顯示可能存在問題, 大家可以移步到github源查看
文章由https://studygolang.com/articles/5837啓發, 進行展開發散.
利用reflect包對struct結構進行遍歷, 對於學習golang有很大的幫助:
完整測試代碼如下, 可以用以輸出完整的struct成員, 增加遞歸函數可以很容易的做到多種類型輸出:
package main
import (
"fmt"
"reflect"
)
type Event struct {
Topic string
Data string
}
type Logs struct {
Addr string
Hash string
Height uint64
Events []Event
}
func main() {
u := Logs{
Addr: "qwrtyuiopasdfghjkl",
Hash: "zxcvbnm",
Height: 1011,
Events: []Event{{Topic: "123456789", Data: "987654321"}, {Topic: "zz123456789", Data: "zz987654321"}},
}
t := reflect.TypeOf(u)
v := reflect.ValueOf(u)
for k := 0; k < t.NumField(); k++ {
fmt.Printf("%s -- %v \n", t.Field(k).Name, v.Field(k).Interface())
if v.Field(k).Kind() == reflect.Slice {
t2 := v.Field(k).Type()
v2 := v.Field(k)
fmt.Println(t2.String() + " --")
for i := 0; i < v2.Len(); i++ {
v3 := v2.Index(i)
for j := 0; j < v3.NumField(); j++ {
fmt.Printf("%s -- %v \n", v3.Type().Field(j).Name, v3.Field(j).Interface())
}
}
}
}
}
編譯結果:
Addr -- qwrtyuiopasdfghjkl
Hash -- zxcvbnm
Height -- 1011
Events -- [{123456789 987654321} {zz123456789 zz987654321}]
[]main.Event --
Topic -- 123456789
Data -- 987654321
Topic -- zz123456789
Data -- zz987654321
對於struct嵌套[]struct的處理方式:
if v.Field(k).Kind() == reflect.Slice {
t2 := v.Field(k).Type()
v2 := v.Field(k)
fmt.Println(t2.String() + " --")
for i := 0; i < v2.Len(); i++ {
v3 := v2.Index(i)
for j := 0; j < v3.NumField(); j++ {
fmt.Printf("%s -- %v \n", v3.Type().Field(j).Name, v3.Field(j).Interface())
}
}
}