我有一个结构体 Person。
type Person struct {
Firstname string
Lastname string
Years uint8
}
然后我有这个结构的两个实例,PersonA 和 Person。
PersonA := {"", "Obama", 6}
PersonB := {"President", "Carter", 8}
我想编写一个函数,在给定每个字段的某些条件(即非空)的情况下,将值从 PersonA 复制到 PersonB。我知道如何通过对字段名称进行硬编码来实现此目的,但我想要一个即使更改 Person 结构也能正常工作的函数。
我知道 Go 反射很有帮助,但问题是获取和设置值需要了解类型,如果您想使用 SetInt 之类的东西。但有没有一种“简单”的方法可以做到这一点?
** JavaScript 类比 **
在 Javascript 中,您只需执行 (for property in someObject) 即可循环。
(for propt in personA) {
if personA[propt] != "" {
// do something
personB[propt] = personA[propt]
}
}
我已经排除的选项:
跟踪映射中每个结构体中的字段,然后结合使用 FieldByName 和 Set* 函数的集合反映包装 http://golang.org/pkg/reflect/#Indirect.
-
手动创建一个通过 Person 字段的循环(如下)。因为我想对许多其他结构(学校、动物等......)进行这种类型的“更新”
if PersonA.Firstname != "" {
PersonB.Firstname = PersonA.Firstname
}
...
if PersonA.Years != "" {
PersonB.Years = PersonA.Years
}
下面的问题让我完成了一半,但仍然无法扩展到我想利用此“更新”功能的所有结构。
在golang中,使用reflect,如何设置结构体字段的值? https://stackoverflow.com/questions/6395076/in-golang-using-reflect-how-do-you-set-the-value-of-a-struct-field
** 其他有用的链接 **GoLang:按名称访问结构属性 https://stackoverflow.com/questions/18930910/golang-access-struct-property-by-name