Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 对戈兰界面的反思_Go_Reflection - Fatal编程技术网

Go 对戈兰界面的反思

Go 对戈兰界面的反思,go,reflection,Go,Reflection,我在Go中有一些结构,它们实现了一个公共方法,所以我为它创建了一个接口(因为在某些方法中,我需要接收接口类型的元素)。基本上我有如下内容: type Model interface { CommonMethod() string } 然后我有一个类似于10 struct的东西来实现这个CommonMethod,例如: type Contact struct { ...Some fields } func (Contact) CommonMethod() string {

我在Go中有一些结构,它们实现了一个公共方法,所以我为它创建了一个接口(因为在某些方法中,我需要接收接口类型的元素)。基本上我有如下内容:

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中一切似乎都很好