去嵌入式自定义界面

时间:2015-04-03 20:34:30

标签: go

我试图了解Go的界面和嵌入。

我在这里尝试做的是创建我自己的自定义writerreader,其中每个都实现io.Writerio.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")
} 

2 个答案:

答案 0 :(得分:2)

您没有嵌入接口,而是在结构中创建它们。

嵌入看起来像:

type MyReader struct {
    io.Reader
}

如果要手动委派给界面,则需要使用相同的方法名称

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

答案 1 :(得分:0)

您的语法错误,因此实际上并未嵌入接口/类型。

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

基本上,如果要显式使用嵌入类型方法,可以使用嵌入类型类型将其称为类型属性,就好像它是属性名称一样。