回答

收藏

在 Go 中遍历结构体的字段

技术问答 技术问答 195 人阅读 | 0 人回复 | 2023-09-12

基本上,遍历 a 唯一的字段值方法(据我所知)struct是这样的:
* K: b  D, P! t$ e$ M

    4 G. N+ j  T. N( ]6 q% y
  • type Example struct    a_number uint32    a_string string}//...r := &Example{(2 我想知道是否有更好、更通用的实现方法[]interface{}{ r.a_number,r.a_string,},所以我不需要单独列出每个参数,或者有更好的方法来循环遍历结构吗?
    + L# P; j8 R7 j' h  @. E
  • 我试图翻阅reflect但是我撞到了墙,因为我不知道怎么拿回来reflect.ValueOf(*r).Field(0).
    2 m  v) u8 S- y: D
  • 谢谢!
    , N5 Y3 N  T8 Q2 ~* ~8 I
  •                                                                
    ' G5 ~% V* E4 W& q9 x
  •     解决方案:                                                               
    % Z& c  i, X6 e2 m
  •                                                                 reflect.Value 使用检索字段后,Field(i)可以调用Interface(). 接口值代表字段值。5 e; H2 y. Z* M$ m: \
  • 没有函数可以将字段值转换为特定类型,因为你可能知道,go 中没有泛型。因此,与签名没有任何功能。GetValue() T 与T字段的类型(当然,这取决于字段)。
    % ^! M. F/ H0 s; _7 Z7 c2 W
  • 您可以在 go  中最接近的是GetValue() interface{},这就是所在reflect.Value.Interface() 提供。- q5 {! v( s& l
  • 如何使用反射 ( )play ) 在结构中获得每个导出字段的值:[code]import  &quot;fmt&quot;    &quot;reflect&quot;)func main()      x := struct{Foo string; Bar int }{&quot;foo&quot;,2}    v := reflect.ValueOf(x)    values := make([]interface{},v.NumField()    for i := 0; i < v.NumField(); i                                                                                                                                                                                     values = v.Field(i).Interface()      fmt.Println(values)}
    " S$ |4 e* x& ], o, p! F
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则