Go 嵌入式自定义接口

我试图了解 Go 的接口和嵌入。


我在这里尝试做的是创建我自己的自定义writer,reader 并且每个人都实现io.Writer或io.Reader


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


cannot use test (type MyReadWriteCloser) as type io.Writer in argument to fmt.Fprintf:

    MyReadWriteCloser does not implement io.Writer (missing Write method)


我认为当你在另一个结构中嵌入一个结构时,你也会得到嵌入结构的方法。有人可以告诉我我错过了什么吗?


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")


LEATH
浏览 209回答 2
2回答

子衿沉夜

您没有嵌入接口,而是将它们作为结构中的字段。嵌入看起来像:type MyReader struct {    io.Reader}如果要手动委托给接口,需要使用相同的方法名func (m MyReader) Read(b []byte) (n int, err error) {    return m.r.Read(b)}

九州编程

您的语法错误,因此实际上并未嵌入接口/类型。type MyWriter struct {    w io.Writer}应该type MyWriter struct {    io.Writer}根据我的理解,适当的嵌入不会让您有理由定义类似的方法;func (m MyWriter) Write(b []byte) (n int, err error) {    m.w.Write(b)    return}因为身体就是m.Write(b)这样,只是没有意义。如果你嵌入一个类型,嵌入类型将能够直接从嵌入类型调用方法(它是最接近继承的东西,对于普通读者来说看起来是一样的)。如果嵌入类型中的方法或属性名称或嵌入类型的嵌入类型之间存在冲突,我不记得解析规则,但一个好的经验法则是避免嵌入类型会导致命名冲突,因为行为不会明显的。编辑:如何覆盖基础类型中的方法并从内部调用“base”(我引用,因为该词选择可能会冒犯某些地鼠)方法的示例;func (m MyWriter) Write(b []byte) (n int, err error) {     b = EncodeBFromMethodThatsInScopeHere(b)     return m.Writer.Write(b)}基本上,如果你想显式地使用嵌入类型方法,你可以将它作为使用嵌入类型类型的类型的属性来引用,就像它是一个属性名称一样。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go