为了账号安全,请及时绑定邮箱和手机立即绑定

是否可以在 Go 中定义匿名接口实现?

是否可以在 Go 中定义匿名接口实现?

Go
万千封印 2023-06-01 14:22:49
考虑一些给定的接口和一个使用它的虚构库的函数// Binary and Ternary operation on intstype NumOp interface {    Binary(int, int) int    Ternary(int, int, int) int}func RandomNumOp(op NumOp) {    var (        a = rand.Intn(100) - 50        b = rand.Intn(100) - 50        c = rand.Intn(100) - 50    )    fmt.Printf("%d <op> %d = %d\n", a, b, op.Binary(a,b))    fmt.Printf("%d <op> %d <op> %d = %d\n", a, b, c, op.Ternary(a,b,c))}实现该接口的可能类型可能是// MyAdd defines additions on 2 or 3 int variablestype MyAdd struct {}func (MyAdd) Binary(a, b int) int {return a + b }func (MyAdd) Ternary(a, b, c int) int {return a + b + c }我正在处理许多不同的接口,这些接口定义了一些函数,在某些情况下需要使用主要作为类似操作的函数来实现,NOP不依赖于任何结构成员并且仅在项目中的单个位置使用(不需要可重用性) ).Go 中是否有一种更简单(更简洁)的方式来定义(最好)使用匿名函数的接口的匿名实现,就像(伪代码,我知道它不是那样工作的):RandomNumOp({   Binary: func(a,b int) int { return a+b},   Ternary: func(a,b,c int) int {return a+b+c},})
查看完整描述

1 回答

?
慕桂英3389331

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 }{}


查看完整回答
反对 回复 2023-06-01
  • 1 回答
  • 0 关注
  • 114 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信