请问golang能让自定义的结构体支持for-range 遍历吗?

scl1994 · · 2115 次点击
<a href="/user/jan-bar" title="@jan-bar">@jan-bar</a> 感谢
#3
更多评论
jan-bar
想要拥有,必定付出。
```go package main import ( &#34;fmt&#34; &#34;reflect&#34; ) func main() { t := test{a: 1, B: &#34;123&#34;, c: 1.1, t: test1{a: 1, B: &#34;123&#34;, c: 1.1}} rangeStruct(t, func(k, v string) { fmt.Printf(&#34;range:%s,%s\n&#34;, k, v) }) t1 := &amp;test{a: 2, B: &#34;234&#34;, c: 2.2, t: test1{a: 2, B: &#34;234&#34;, c: 2.2}} rangeStruct(t1, func(k, v string) { fmt.Printf(&#34;range:%s,%s\n&#34;, k, v) }) } type test struct { a int B string `json:&#34;b&#34;` c float64 t test1 } type test1 struct { a int B string `json:&#34;b&#34;` c float64 } func rangeStruct(in interface{}, h func(k, v string)) { rType, rVal := reflect.TypeOf(in), reflect.ValueOf(in) if rType.Kind() == reflect.Ptr { // 传入的in是指针,需要.Elem()取得指针指向的value rType, rVal = rType.Elem(), rVal.Elem() } if rType.Kind() != reflect.Struct { return } for i := 0; i &lt; rType.NumField(); i++ { // 遍历结构体 t, f := rType.Field(i), rVal.Field(i) // fmt.Printf(&#34;%v,%v\n&#34;, t, f) // 此处可以参照f.String(),f.Int(),f.Float()源码,处理不同类型,我这里统一转成string类型了 if f.Kind() != reflect.Struct { // 不深入遍历结构体了,有需要自己实现吧 h(t.Name, fmt.Sprint(f)) } } } ```
#1
推荐自动生成,无损性能
#2