我在Go中有一些结构体,它们实现了一个通用方法,所以我为此创建了一个接口(interface)(因为在某些方法中我需要接收接口(interface)类型的元素),基本上我有以下内容:
type Model interface {
CommonMethod() string
}
然后,我有类似10的结构来实现该CommonMethod,例如:
type Contact struct {
...Some fields
}
func (Contact) CommonMethod() string {
return "Something"
}
直到这里一切都还好。然后,我有一个通用方法,该方法将接收
Model
的2个实例,此函数的原型(prototype)为:func MyFunction(NewObject Model,PreviousObject Model)
在该函数中,我需要比较字段:两个对象之间的字段名称和值。我正在尝试使用
Reflect
来实现,但是如果我使用reflect.ValueOf()
,我只会获得属性的值,而看不到任何获得名称的方法。所以,有没有一种方法可以获取Model接口(interface)中附带的结构,然后可以使用reflect.TypeOf()
?编辑:
如果我设置这个:
NewObjectListing := reflect.TypeOf(NewObject)
numFields := NewObjectListing.NumField()
我收到此错误:
panic :反射(reflect):非结构类型的NumField
但是,如果我使用:
NewObjectListing := reflect.ValueOf(NewObject)
numFields := NewObjectListing.NumField()
没有错误,但是我不能做类似
NewObjectListing.Field(i).Name
的事情 最佳答案
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)个字段的名称。 reflect.ValueOf(*).Field(n).CanInterface()
为true,则可以通过field n+1
reflect.ValueOf(*).Field(n).Name()
的名称关于go - 通过Golang的界面进行反射(reflection),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44974621/