在Go中扩展接口

时间:2013-12-13 01:30:39

标签: go thrift scribe

相当新的去。我正在尝试修改这个抄写服务器实现:

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

我想将一个频道传递给Log() func,这样我就可以将划线数据传递到一个单独的go例程但是我不确定如何修改scribe/thrift.go以将日志接口扩展到是

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

(或者是否需要这样做,如果有某种方法可以扩展接口而不会弄乱原始库)。

1 个答案:

答案 0 :(得分:8)

您无法修改或扩展已声明的界面,您只能创建一个新界面 扩展旧的。但是你不能在界面中重新声明方法。

这意味着你想要做的事情(修改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接口)但保留了您的附加频道。