在Go中扩展接口

Dav*_*vid 5 thrift go scribe

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

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

我想将一个通道传递给Log()func,所以我可以将scribe数据传递给一个单独的go例程,但是我不知道如何修改scribe/thrift.go以扩展日志接口

Log(messages []*scribe.LogEntry, counts chan string)  
Run Code Online (Sandbox Code Playgroud)

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

nem*_*emo 8

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

这意味着您无法做到(修改Scribe界面以使其Log方法具有不同的签名).

你可以做的是拥有一个保持你的通道的类型,并嵌入你想要扩展的结构.

例:

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)
}
Run Code Online (Sandbox Code Playgroud)

上面的例子定义了一个嵌入Scribe和定义自己的Log方法的结构,利用嵌入的方法Scribe.此结构可以在Scribe 预期的任何地方使用(因为它实现了Scribe接口),但保留了您的附加通道.