1 回答
TA贡献2036条经验 获得超8个赞
如果实施必须奏效
如果实现接口的值必须有效(例如,它的方法必须可以调用而不会出现恐慌),那么你就不能这样做。
方法声明必须在顶层(文件级)。要实现一个具有 0 个以上方法的接口,需要在某处声明方法。
当然,您可以使用一个结构并嵌入一个现有的实现,但话又说回来,它需要已经有一个现有的实现,其方法必须已经在“某处”定义:在文件级别。
如果您需要一个“虚拟”但可行的实现,他们会使用/传递任何MyAdd实现,例如您的类型的值。如果您想强调实现无关紧要,则创建一个虚拟实现,其名称表明:
type DummyOp struct{}
func (DummyOp) Binary(_, _ int) int { return 0 }
func (DummyOp) Ternary(_, _, _ int) int { return 0 }
如果您需要动态地提供一些方法的实现,您可以创建一个委托结构类型来保存这些方法的函数,实际的方法检查是否设置了相应的函数,在这种情况下调用它,否则什么都不会完毕。
这就是它的样子:
type CustomOp struct {
binary func(int, int) int
ternary func(int, int, int) int
}
func (cop CustomOp) Binary(a, b int) int {
if cop.binary != nil {
return cop.binary(a, b)
}
return 0
}
func (cop CustomOp) Ternary(a, b, c int) int {
if cop.ternary != nil {
return cop.ternary(a, b, c)
}
return 0
}
使用它时,您可以自由地只提供函数的一个子集,其余的将是空操作:
RandomNumOp(CustomOp{
binary: func(a, b int) int { return a + b },
})
如果不需要实施工作
如果你只需要一个实现接口的值,但你不需要它的方法是“可调用的”(调用时不要恐慌),你可以简单地使用匿名结构文字,嵌入接口类型:
var op NumOp = struct{ NumOp }{}
- 1 回答
- 0 关注
- 114 浏览
添加回答
举报