相当新。我正在尝试修改此Go scribe服务器的实现:

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

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

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

(或者是否甚至需要这样做,以及是否可以通过某种方式扩展接口(interface)而不会弄乱原始库)。

最佳答案

您不能修改或扩展已经声明的接口(interface),只能创建一个新接口(interface),可能
扩展旧的。但是您不能在接口(interface)中重新声明方法。

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

您可以做的是拥有一个可以保存您的 channel 的类型,并使用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接口(interface)),但拥有您的其他 channel 。

10-07 15:13