您想要的主要是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) }
(游乐场链接)
这里有两个警告:
您需要一个指向要更改的指针。如果有值,则需要返回修改后的结果。
尝试修改未导出的字段通常会引起反射恐慌。如果您打算修改未导出的字段,请确保在包内执行此 *** 作。
该代码相当灵活,如果您需要根据类型的不同行为,则可以使用switch语句或类型switch(在field.Interface()返回的值上)。
编辑:至于标记行为,您似乎已经知道了。一旦有了字段并检查了它是否是字符串,就可以
field.Tag.Get("max")从那里使用并解析它。
Edit2:我在标签上犯了一个小错误。标签是反射类型的一部分。结构的类型,因此可以使用它们(有点麻烦)
msValue.Type().Field(i).Tag.Get("max")
(您在注释中发布的带有有效Tag的代码的Playground版本)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)