在Golang中反映接口

时间:2017-07-07 15:31:28

标签: go reflection

我在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

之类的事情

1 个答案:

答案 0 :(得分:0)

  1. reflect.TypeOf()只返回输入值的type,但没有任何值
  2. 您无法从type
  3. 获得任何字段
  4. reflect.ValueOf()返回输入值的value
  5. 如果您从输入中获得的typestruct,则您将能够从输入reflect.ValueOf的INPUT VALUE中获取numField。
    1. reflect.ValueOf(*).Field(n)返回结构
    2. 的第(n + 1)个字段的VALUE
    3. 如果您从上述方法中得不到任何结果,请为上面的字段指定一个值。
    4. 最好的方法是为输入结构的每个字段赋值

    5. reflect.TypeOf(*).Field(n).Name()返回第(n + 1)个字段的NAME。

    6. 如果您想正确使用此方法,请将您的字段名称从较低的名称更改为标题名称(hello - > Hello)
    7. 如果reflect.ValueOf(*).Field(n).CanInterface()为真,您可以field n+1
    8. 获取reflect.ValueOf(*).Field(n).Name()的名称