在Go语言中扩展接口

6

我对Go语言还不是很熟悉。我想要修改这个Go Scribe服务器实现:

https://github.com/samuel/go-thrift/blob/master/examples/scribe_server/main.go

我想要将一个channel传递给Log()函数,以便我可以将scribe数据传递给单独的Go例程,但我不确定如何修改scribe/thrift.go来扩展日志接口为

Log(messages []*scribe.LogEntry, counts chan string)  

(或者是否需要这样做,如果有一种方法可以扩展接口而不干扰原始库)。
1个回答

10

你无法修改或扩展已经声明的接口,你只能创建一个新的接口,并可能扩展旧接口。但你不能在接口中重新声明方法。

这意味着你想要做的事情(修改Scribe接口,使其Log方法具有不同的签名)是不可能的。

你可以做的是拥有一个类型,它持有你的通道并嵌入(embeds)你想要扩展的结构体。

示例:

type Scribe interface {
    Log(Messages []*LogEntry) (ResultCode, error)
}

type ModifiedScribe struct {
    Scribe
    counts chan string
}

func (m *ModifiedScribe) Log(Messages []*LogEntry) (ResultCode, error) {
    // do something with m.counts

    // call embedded implementation's Log message
    return m.Scribe.Log(Messages)
}

上面的示例定义了一个嵌入了Scribe并定义了自己的Log方法的结构体, 利用了嵌入的Scribe的方法。由于这个结构体实现了Scribe接口并持有额外的通道, 所以可以在任何需要Scribe的地方使用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接