我在Go中有一些结构体,它们实现了一个通用方法,因此我为此创建了一个接口(因为在某些方法中我需要接收接口类型的元素),基本上我有类似以下内容:
1 2 3 | type Model interface { CommonMethod() string } |
然后,我有类似10的结构来实现该CommonMethod,例如:
1 2 3 4 5 6 7 | type Contact struct { ...Some fields } func (Contact) CommonMethod() string { return"Something" } |
直到这里一切都还好。然后,我有一个通用方法,该方法将接收2个
1 | func MyFunction(NewObject Model,PreviousObject Model) |
在该函数中,我需要比较字段:两个对象之间的字段名称和值。我正在尝试使用
如果我设置这个:
1 2 | NewObjectListing := reflect.TypeOf(NewObject) numFields := NewObjectListing.NumField() |
我收到此错误:
恐慌:反映:非结构类型的NumField
但是,如果我使用:
1 2 | NewObjectListing := reflect.ValueOf(NewObject) numFields := NewObjectListing.NumField() |
没有错误,但是我不能做类似
-
我不明白,如果您可以呼叫
reflect.ValueOf ,则可以呼叫reflect.TypeOf 或Value.Type() 。您可以举一个例子说明您在MyFunction 中的实际操作吗? - @JimB嗨,我添加了更多信息
-
reflect.Value 具有Type 方法,但是我想知道在NewObject 中传递的确切类型吗? - 无论您想做什么,都应该考虑向界面添加另一种方法。如果您接受接口,那是因为您需要接口。如果需要修改结构的属性,请改用结构,或在接口中添加方法以封装该逻辑。
- @JimB的确切对象是一个Contact对象,该结构包含30个字段。我打印了接口,CommonMethod中的一切似乎都很好
- 我有许多可以识别为Model实例的结构,Contacts,users,Games。因此,在CommonMethod中,我可以接收该实例的任何对象
-
@SrednyMCasanova:您需要提供一个最小的可复制示例。我不确定您在做什么,可以在值上获得
NumField 但不能从类型上获得,或者在哪里不能从Value 调用Type 。
最好的方法是为输入结构的每个字段分配值