我在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
  • 如果您从输入中获得的typestruct,则可以从reflect.ValueOf返回的INPUT VALUE中获取一个numField。


  • reflect.ValueOf(*).Field(n)返回结构
  • 的第(n + 1)个字段的值
  • 如果上面的方法没有任何帮助,请为上面的字段分配一个值。
  • 最好的方法是为输入结构的每个字段分配值
  • reflect.TypeOf(*).Field(n).Name()返回第(n + 1)个字段的名称。
  • 如果要正确使用此方法,请将字段名从低位更改为标题一(您好-> Hello)
  • 如果reflect.ValueOf(*).Field(n).CanInterface()为true,则可以通过field n+1
  • 获取reflect.ValueOf(*).Field(n).Name()的名称

    关于go - 通过Golang的界面进行反射(reflection),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44974621/

    10-13 05:36