为了账号安全,请及时绑定邮箱和手机立即绑定

Go 嵌入式自定义接口

Go 嵌入式自定义接口

Go
LEATH 2021-09-27 17:19:39
我试图了解 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 mainimport ("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 回答

?
子衿沉夜

TA贡献1828条经验 获得超3个赞

您没有嵌入接口,而是将它们作为结构中的字段。


嵌入看起来像:


type MyReader struct {

    io.Reader

}

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


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

    return m.r.Read(b)

}


查看完整回答
反对 回复 2021-09-27
?
九州编程

TA贡献1785条经验 获得超4个赞

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


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)

}

基本上,如果你想显式地使用嵌入类型方法,你可以将它作为使用嵌入类型类型的类型的属性来引用,就像它是一个属性名称一样。


查看完整回答
反对 回复 2021-09-27
  • 2 回答
  • 0 关注
  • 208 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信