英文:
Extending Interfaces in Go
问题
你好!以下是你要翻译的内容:
对于Go语言我还比较新手。我正在尝试修改这个Go Scribe服务器的实现:
https://github.com/samuel/go-thrift/blob/master/examples/scribe_server/main.go
我想要将一个通道(channel)传递给Log()
函数,这样我就可以将scribe数据传递给一个单独的Go协程(goroutine),但我不确定如何修改scribe/thrift.go
来扩展日志接口为:
Log(messages []*scribe.LogEntry, counts chan string)
(或者是否需要这样做,以及是否有一种方法可以在不干扰原始库的情况下扩展接口)。
英文:
Fairly new to go. I'm trying to modify this go scribe server implementation:
https://github.com/samuel/go-thrift/blob/master/examples/scribe_server/main.go
I'd like to pass a channel to the Log()
func so I can pass scribe data to a separate go routine but I'm not sure how to modify scribe/thrift.go
to extend the log interface to be
Log(messages []*scribe.LogEntry, counts chan string)
(or whether this is even needed and if there is some way to extend the interface without messing with the original library).
答案1
得分: 10
你不能修改或扩展已经声明的接口,你只能创建一个新的接口,可能会扩展旧的接口。但是你不能在接口中重新声明方法。
这意味着你想要做的(修改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) {
// 使用 m.counts 做一些操作
// 调用嵌入实现的 Log 方法
return m.Scribe.Log(Messages)
}
上面的示例定义了一个结构体,它嵌入了一个 Scribe
并定义了自己的 Log
方法,利用了嵌入的 Scribe
的方法。这个结构体可以在期望 Scribe
的任何地方使用(因为它实现了 Scribe
接口),但它还持有额外的通道。
英文:
You can't modify or extend an already declared interface, you can only create a new one, possibly
extending the old one. But you cannot re-declare methods in the interface.
This means that what you want to do (modify the Scribe
interface so that its Log
method has a different signature) is not possible.
What you can do is to have a type which holds your channel and embeds the structure you want to extend.
Example:
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)
}
The example above defines a struct which embeds a Scribe
and defines its own Log
method,
utilizing the one of the embedded Scribe
. This struct can be used wherever a Scribe
is expected (as it implements the Scribe
interface) but holds your additional channel.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论