代码之家  ›  专栏  ›  技术社区  ›  Saqib Ali

我可以在Go中使用循环来获得结构的排列吗?

go
  •  0
  • Saqib Ali  · 技术社区  · 3 年前

    基本上,(据我所知)迭代的字段值的唯一方法 struct 是这样的:

    type Example struct {
        a_number uint32
        a_string string
    }
    
    //...
    
    r := &Example{(2 << 31) - 1, "...."}:
    for _, d:= range []interface{}{ r.a_number, r.a_string, } {
      //do something with the d
    }
    

    我想知道,是否有更好、更通用的方法来实现 []interface{}{ r.a_number, r.a_string, } ,所以我不需要单独列出每个参数,或者,有更好的方法在结构中循环吗?

    我试着浏览 reflect 包裹,但我撞到了墙上,因为我不知道取回后该怎么办 reflect.ValueOf(*r).Field(0) .

    谢谢

    0 回复  |  直到 7 年前
        1
  •  -2
  •   Ilya    2 年前

    在您检索到之后 reflect.Value 通过使用 Field(i) 你可以得到一个 通过调用从中获取接口值 Interface() 所述接口值然后表示 字段的值。

    没有将字段的值转换为具体类型的函数, 正如你可能知道的,go中没有泛型。因此,签名没有任何功能 GetValue() T 具有 T 是该字段的类型(当然会根据字段的不同而变化)。

    你在围棋中最接近的成绩是 GetValue() interface{} 这正是 reflect.Value.Interface() 提供。

    以下代码说明如何获取结构中每个导出字段的值 使用反射( play ):

    import (
        "fmt"
        "reflect"
    )
    
    func main() {
        x := struct{Foo string; Bar int }{"foo", 2}
    
        v := reflect.ValueOf(x)
    
        values := make([]interface{}, v.NumField())
    
        for i := 0; i < v.NumField(); i++ {
            values[i] = v.Field(i).Interface()
        }
    
        fmt.Println(values)
    }