go - 如何通过组合不同包的接口(interface)来创建接口(interface)?

标签 go interface rtp embedding

情况

对于代码库,我使用 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 interfacecombining 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 函数,该函数返回 RTPReadCloserRTPWriteCloser 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/

相关文章:

java - 可以重新初始化接口(interface)变量吗?

ffmpeg - 视频流通过 rtp 协议(protocol)失败

c# - 保存来自网络摄像机 RTP 流的 JPEG 文件

go - 像 [0 :2] 这样的 slice 声明

go - Golang-为什么总是ItoA在返回字符串时删除初始0

go - aws-sdk-go s3 在存储桶之间移动目录

raspberry-pi - 我应该使用 RTP 还是 WebRTC 进行本地网络音频通信

postgresql - 如何防止GORM使用先前查询的参数

.net - 引用接口(interface)

java - 如何像 Java 接口(interface)一样在 swift 中使用闭包