Go嵌入式自定义接口(interface)

标签 go

我正在尝试了解 Go 的接口(interface)和嵌入。

我在这里要做的是创建我自己的自定义 writerreader,其中每个实现 io.Writerio.Reader

现在我想将这些实现基本接口(interface)的自定义结构嵌入到另一个实现Read/Write/Close 的自定义结构中。下面的代码是我目前所拥有的,但是当我运行它时出现以下错误

不能在 fmt.Fprintf 的参数中使用测试(类型 MyReadWriteCloser)作为类型 io.Writer: MyReadWriteCloser 没有实现 io.Writer(缺少 Write 方法)

我想当你将一个结构嵌入另一个结构时,你也会得到嵌入结构的方法。有人可以告诉我我缺少什么吗?

package main

import (
"fmt"
"io"
)

type MyWriter struct {
    w io.Writer
}

func (m MyWriter) Write(b []byte) (n int, err error) {
    // encrypt b and write to underlying writer
    m.w.Write(b)
    return
}

type MyReader struct {
    r io.Reader
}

func (m MyReader) Read(b []byte) (n int, err error) {
    // decrypt b
    m.r.Read(b)
    return
}

type MyReadWriteCloser struct {
    MyWriter
    MyReader
}

func (m MyReadWriteCloser) Close() error {
    return nil
}

func main() {
    fmt.Println("main start")

    r, w := io.Pipe()

    test := MyReadWriteCloser{
        MyWriter{w},
        MyReader{r},
    }
    fmt.Fprintf(test, "hello world\n")
} 

最佳答案

您不是在嵌入接口(interface),而是将它们作为结构中的字段。

嵌入看起来像:

type MyReader struct {
    io.Reader
}

如果要手动委托(delegate)给接口(interface),需要使用相同的方法名

func (m MyReader) Read(b []byte) (n int, err error) {
    return m.r.Read(b)
}

关于Go嵌入式自定义接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29439311/

相关文章:

xml - Go 中的低级 XML 流编写器?

http - 转到 : add logging to each router

go - 每个用户处理一条消息

arrays - 在 golang 中将接口(interface)数组转换为映射数组的最佳方法是什么?

go - 使用长度为零的缓冲 channel

google-app-engine - 是否应根据 Google App Engine 的请求创建 Firestore 客户端?

go - 知道如何将 GTK-Parasite 与 Go-GTK 一起使用吗?

go - gRPC 说一个函数 "not implemented",其余的都很好

go - 有没有一种方法可以使用 mux 路由来选择处理程序而不使用 golang 的 http listenAndServe?

json - 如何通过结构重新格式化 JSON?