Go 对戈兰界面的反思
我在Go中有一些结构,它们实现了一个公共方法,所以我为它创建了一个接口(因为在某些方法中,我需要接收接口类型的元素)。基本上我有如下内容:Go 对戈兰界面的反思,go,reflection,Go,Reflection,我在Go中有一些结构,它们实现了一个公共方法,所以我为它创建了一个接口(因为在某些方法中,我需要接收接口类型的元素)。基本上我有如下内容: type Model interface { CommonMethod() string } 然后我有一个类似于10 struct的东西来实现这个CommonMethod,例如: type Contact struct { ...Some fields } func (Contact) CommonMethod() string {
type Model interface {
CommonMethod() string
}
然后我有一个类似于10 struct的东西来实现这个CommonMethod,例如:
type Contact struct {
...Some fields
}
func (Contact) CommonMethod() string {
return "Something"
}
直到这里一切都好。然后我有一个通用方法,它将接收2个模型的实例,该函数的原型是:
func MyFunction(NewObject Model,PreviousObject Model)
在该函数中,我需要比较两个对象之间的字段:字段名称和值。我试图使用Reflect
来实现它,但是如果我使用Reflect.ValueOf()
我只获取属性的值,我看不到任何获取名称的方法。那么,有没有一种方法可以获取模型接口内部的结构,以便使用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
,而不返回任何值
仅从类型
reflect.ValueOf()
返回输入值的值
如果从输入中获得的类型
是一个结构
,则可以从输入值中获得一个numField,该值通过reflect.ValueOf
返回
reflect.ValueOf(*)。字段(n)
返回结构的第(n+1)个字段的值
如果您没有从上述方法中获得任何信息,请为上面的字段指定一个值
最好的方法是为输入结构的每个字段赋值
reflect.TypeOf(*).Field(n).Name()
返回第(n+1)个字段的名称
如果要正确使用此方法,请将字段名从较低的更改为标题(hello->hello)
如果reflect.ValueOf(*).Field(n).CanInterface()
为true,则可以通过reflect.ValueOf(*).Field(n).name()获取字段n+1的名称
我不明白,如果你可以调用reflect.ValueOf
你可以调用reflect.TypeOf
或Value.Type()
。你能在 MyStudio中展示一个例子吗?@ JIMB-HI,我添加了更多的信息“代码>反射”。Value<代码>有一个<代码>类型< /代码>方法,但是我很好奇在<代码> NeXObjult<代码>中传递的确切类型。你应该考虑为你想做的任何事情添加另一个方法到你的界面。如果你接受一个接口,那是因为你需要一个接口。如果需要修改结构上的属性,请改为接受结构,或向接口添加一个方法来封装该逻辑。@JimB确切的对象是联系人对象,该结构包含30个字段。我打印了界面,在CommonMethod中一切似乎都很好