我正在做一个项目,我有两个structs,我希望能够在不编写两个不同对象方法的情况下对它们执行相同的逻辑,但我不确定如何为接口强制字段。例如,假设我有以下两个结构,有许多不同的字段,但它们共享一个:
type Item1 struct {
itemField string
...some other fields
}
type Item2 struct {
itemField string
...some other fields that differ from those of Item1
}
这些项目有几个不同的功能,但它们有一个共同的功能:
func (Item1) ItemLogic() {
--some logic--
}
func (Item2) ItemLogic() {
--some different logic--
}
我想把一个函数组合在一起,在处理项目逻辑之前,它会对这些项目进行一些前期检查,但我不想写两个单独的函数。我可以写一个接口,这样我就可以像这样传递Item1和Item2:
type IItem interface {
ItemLogic()
}
但我不能强制要求作为函数一部分传递的字段有一个字段itemField
,这样我就可以编写这样的函数:
func MainFunction(item IItem) {
if item.ItemField == "..." {
....
}
item.ItemLogic()
}
这里的问题是,理论上我可以传入一个具有ItemLogic
函数但缺少ItemField
字段的项,从而导致零指针。有没有什么我不知道的方法来强制执行这个字段?或者,我缺少一些更好的设计吗?我想我可以使用Go中的反射包来检查传入的对象是否有字段,但感觉很乱(我宁愿不让别人传入坏对象(。有更好的方法吗?
不能对接口执行字段级操作,因为接口在定义上只是方法集。但是,您可以使用一个接口来获取ItemField
:
type WithItemField interface {
GetItemField() string
}
并为具有GetItemField
方法的类型实现该方法
然后你可以检查一个对象是否有itemField:
func MainFunction(item IItem) {
if withItemField, ok:=item.(WithItemField); ok {
itemField:=withItemField.GetItemField()
// validate
}
item.ItemLogic()
}