【问题标题】:Reflect over Interface in Golang在 Golang 中反射接口
【发布时间】:2017-12-11 23:29:35
【问题描述】:

我在Go中有一些结构,它们实现了一个通用方法,所以我为它创建了一个接口(因为在某些方法中我需要接收接口类型的元素)。基本上我有类似的东西:

type Model interface {
    CommonMethod() string
}

然后我有类似 10 的结构来实现该 CommonMethod,例如:

type Contact struct {
    ...Some fields
}

func (Contact) CommonMethod() string {
    return "Something"
}

直到这里一切正常。然后我有一个通用方法,它将接收Model 的 2 个实例,该函数的原型是:

func MyFunction(NewObject Model,PreviousObject Model)

在该函数中,我需要比较字段:两个对象之间的字段名称和值。我正在尝试使用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之类的事情

【问题讨论】:

  • 我不明白,如果你可以打电话给reflect.ValueOf你可以打电话给reflect.TypeOfValue.Type()。您能否在MyFunction 中举例说明您实际在做什么?
  • @JimB 嗨,我添加了更多信息
  • A reflect.Value 有一个 Type 方法,但我很好奇 NewObject 中传递的 exact 类型?
  • 您应该考虑为您的界面添加另一种方法来完成您想要做的任何事情。如果你接受一个接口,那是因为你需要一个接口。如果您需要修改结构的属性,则改为接受结构,或向接口添加方法来封装该逻辑。
  • @JimB 确切的对象是一个 Contact 对象,该结构包含 30 个字段。我打印了界面,CommonMethod 中的一切似乎都很好

标签: go reflection


【解决方案1】:
  1. reflect.TypeOf() 只返回输入值的type,没有任何值
  2. 您将无法从 type 获取任何字段
  3. reflect.ValueOf() 返回输入值的value
  4. 如果您从输入中获得的typestruct,您将能够从reflect.ValueOf 返回的INPUT VALUE 中获得一个numField。

  1. reflect.ValueOf(*).Field(n) 返回结构体第 (n+1) 个字段的值
  2. 如果您从上述方法中一无所获,请为上述字段赋值。
  3. 最好的方法是为输入结构的每个字段赋值

  4. reflect.TypeOf(*).Field(n).Name() 返回第 (n+1) 个字段的名称。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    相关资源
    最近更新 更多