遍历Struct中的字符串字段

遍历Struct中的字符串字段,第1张

遍历Struct中的字符串字段

您想要的主要是reflect.Value上称为

NumFields()int
和的方法
Field(int)
。您唯一真正缺少的是字符串检查和
SetString
方法。

    package main    import "fmt"    import "reflect"    import "strings"    type MyStruct struct {        A,B,C string        I int        D string        J int    }    func main() {        ms := MyStruct{"Green ", " Eggs", " and ", 2, " Ham      ", 15}        // Print it out now so we can see the difference        fmt.Printf("%s%s%s%d%s%dn", ms.A, ms.B, ms.C, ms.I, ms.D, ms.J)        // We need a pointer so that we can set the value via reflection        msValuePtr := reflect.ValueOf(&ms)        msValue := msValuePtr.Elem()        for i := 0; i < msValue.NumField(); i++ { field := msValue.Field(i) // Ignore fields that don't have the same type as a string if field.Type() != reflect.TypeOf("") {     continue } str := field.Interface().(string) str = strings.TrimSpace(str) field.SetString(str)        }        fmt.Printf("%s%s%s%d%s%dn", ms.A, ms.B, ms.C, ms.I, ms.D, ms.J)    }

(游乐场链接)

这里有两个警告:

  1. 您需要一个指向要更改的指针。如果有值,则需要返回修改后的结果。

  2. 尝试修改未导出的字段通常会引起反射恐慌。如果您打算修改未导出的字段,请确保在包内执行此 *** 作。

该代码相当灵活,如果您需要根据类型的不同行为,则可以使用switch语句或类型switch(在field.Interface()返回的值上)。

编辑:至于标记行为,您似乎已经知道了。一旦有了字段并检查了它是否是字符串,就可以

field.Tag.Get("max")
从那里使用并解析它。

Edit2:我在标签上犯了一个小错误。标签是反射类型的一部分。结构的类型,因此可以使用它们(有点麻烦)

msValue.Type().Field(i).Tag.Get("max")

(您在注释中发布的带有有效Tag的代码的Playground版本)。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5163319.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-18
下一篇 2022-11-18

发表评论

登录后才能评论

评论列表(0条)

保存