【发布时间】:2017-12-11 23:29:35
【问题描述】:
我在Go中有一些结构,它们实现了一个通用方法,所以我为它创建了一个接口(因为在某些方法中我需要接收接口类型的元素)。基本上我有类似的东西:
type Model interface {
CommonMethod() string
}
然后我有类似 10 的结构来实现该 CommonMethod,例如:
type Contact struct {
...Some fields
}
func (Contact) CommonMethod() string {
return "Something"
}
直到这里一切正常。然后我有一个通用方法,它将接收Model 的 2 个实例,该函数的原型是:
func MyFunction(NewObject Model,PreviousObject Model)
在该函数中,我需要比较字段:两个对象之间的字段名称和值。我正在尝试使用Reflect 来实现它,但如果我使用reflect.ValueOf(),我只会得到属性的值,而且我看不到任何获取名称的方法。那么,有没有一种方法可以让我获得 Model 接口内部的结构,这样我就可以使用reflect.TypeOf()?
编辑:
如果我设置这个:
NewObjectListing := reflect.TypeOf(NewObject)
numFields := NewObjectListing.NumField()
我收到此错误: 恐慌:反映:非结构类型的 NumField
但如果我使用:
NewObjectListing := reflect.ValueOf(NewObject)
numFields := NewObjectListing.NumField()
没有错误,但我不能做NewObjectListing.Field(i).Name之类的事情
【问题讨论】:
-
我不明白,如果你可以打电话给
reflect.ValueOf你可以打电话给reflect.TypeOf或Value.Type()。您能否在MyFunction中举例说明您实际在做什么? -
@JimB 嗨,我添加了更多信息
-
A
reflect.Value有一个Type方法,但我很好奇NewObject中传递的 exact 类型? -
您应该考虑为您的界面添加另一种方法来完成您想要做的任何事情。如果你接受一个接口,那是因为你需要一个接口。如果您需要修改结构的属性,则改为接受结构,或向接口添加方法来封装该逻辑。
-
@JimB 确切的对象是一个 Contact 对象,该结构包含 30 个字段。我打印了界面,CommonMethod 中的一切似乎都很好
标签: go reflection