我在Go中有一些结构,它们实现了一个通用的方法,所以我为它创建了一个接口(因为在某些方法中我需要接收一个接口类型的元素)。基本上我有类似的东西:
type Model interface {
CommonMethod() string
}
然后我有10个结构来实现CommonMethod,例如:
type Contact struct {
...Some fields
}
func (Contact) CommonMethod() string {
return "Something"
}
直到这里一切都好。然后我有一个通用的方法将接收2个Model
的实例,这个函数的proptotype是:
func MyFunction(NewObject Model,PreviousObject Model)
在该函数中,我需要比较字段:字段的名称和2个对象之间的值。我正在尝试使用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
答案 0 :(得分:0)
reflect.TypeOf()
只返回输入值的type
,但没有任何值type
reflect.ValueOf()
返回输入值的value
type
是struct
,则您将能够从输入reflect.ValueOf
的INPUT VALUE中获取numField。reflect.ValueOf(*).Field(n)
返回结构最好的方法是为输入结构的每个字段赋值
reflect.TypeOf(*).Field(n).Name()
返回第(n + 1)个字段的NAME。
reflect.ValueOf(*).Field(n).CanInterface()
为真,您可以field n+1
reflect.ValueOf(*).Field(n).Name()
的名称
醇>