情况
对于代码库,我使用 pion/rtpio包。
我正在尝试扩展接口(interface)RTPwriter
向其中添加一个 Close()
函数。目标是创建一个 NewRTPWritCloser()
函数,该函数返回具有组合函数的 writeCloser。
从包中,我看到作者已经创建了接口(interface)RTPWriteCloser
type RTPWriteCloser interface {
RTPWriter
io.Closer
}
尝试
我这样做是为了重用该函数,这是错误的,但我还不知道替代方案:
func NewRTPWriteCloser(wc io.WriteCloser) rtpio.RTPWriteCloser {
writeCloser := rtpio.NewRTPWriter(wc)
return writeCloser
}
并期望wc
准备好自己的Close()
函数,因此返回的writeCloser
将满足接口(interface)RTPWriteCloser
。但是,我收到了 (missing method Close)
错误。
函数NewRTPWriter()
是这样的:
func NewRTPWriter(w io.Writer) RTPWriter {
return &RawRTPWriter{
dst: w,
}
}
问题
- 我们如何同时从多个嵌入接口(interface)创建一个具有所有所需功能的实例以满足嵌入接口(interface)?
- 在本例中,我们想要为
RTPWriteCloser
接口(interface)创建NewRTPWriteCloser
函数,但我们不能先创建一个 writer,然后为其添加 Close 函数? - 我是否必须创建一个
RTPWriteCloser
结构并重写接受该结构的所有必要函数? (看起来效率很低)
已搜索
我自己进行了搜索,例如:interfaces inside interface和 combining or extending interfaces ,但他们并没有让我最终理解我的问题。
最佳答案
您应该定义一个适配器结构,将 io.Closer
语义添加到您的基本类型中:
type WrappingRTPWriteCloser struct {
w RTPWriter
c io.Closer
}
然后您应该定义 Close
方法以满足该接口(interface):
func (w *WrappingRTPWriteCloser) Close() error {
return w.c.Close()
}
然后,您应该在创建实例时创建包装结构的新引用:
func NewRTPWriteCloser(wc io.WriteCloser) rtpio.RTPWriteCloser {
writeCloser := WrappingRTPWriteCloser{
w: rtpio.NewRTPWriter(wc),
c: wd,
}
return writeCloser
}
另一种解决方案是使用包提供的开箱即用的 RTPPipe
函数,该函数返回 RTPReadCloser
和 RTPWriteCloser
code> 实例(将 RTPReadCloser
输入通过管道传输到 RTPWriteCloser
输出):
// RTPPipe creates a new RTPPipe and returns the reader and writer.
func RTPPipe() (RTPReadCloser, RTPWriteCloser) {
r, w := io.Pipe()
return &pipeRTPReader{closer: r, rtpReader: NewRTPReader(r, 1500)}, &pipeRTPWriter{closer: w, rtpWriter: NewRTPWriter(w)}
}
关于go - 如何通过组合不同包的接口(interface)来创建接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73077586/