美文网首页
go 接口赋值和相等 需要注意的地方

go 接口赋值和相等 需要注意的地方

作者: phu | 来源:发表于2018-09-18 11:04 被阅读0次

    第一个接口:
    package one

    type ReadWriter interface { Read(buf []byte) (n int, err error)
    Write(buf []byte) (n int, err error)
    }
    第二个接口位于另一个包中:
    package two

    type IStream interface { Write(buf []byte) (n int, err error)
    Read(buf []byte) (n int, err error) }

    在Go语言中,这两个接口实际上并无区别,因为:  任何实现了one.ReadWriter接口的类,均实现了two.IStream;  任何one.ReadWriter接口对象可赋值给two.IStream,反之亦然;  在任何地方使用one.ReadWriter接口与使用two.IStream并无差异

    以下这些代码可编译通过:
    var file1 two.IStream = new(File)
    var file2 one.ReadWriter = file1
    var file3 two.IStream = file2

    接口赋值并不要求两个接口必须等价。如果接口A的方法列表是接口B的方法列表的子集, 那么接口B可以赋值给接口A。例如,假设我们有Writer接口:
    type Writer interface { Write(buf []byte) (n int, err error) }
    就可以将上面的one.ReadWriter和two.IStream接口的实例赋值给Writer接口:
    var file1 two.IStream = new(File)
    var file4 Writer = file1
    但是反过来并不成立:
    var file1 Writer = new(File)
    var file5 two.IStream = file1
    // 编译不能通过 这段代码无法编译通过,原因是显然的:file1并没有Read()方法。

    相关文章

      网友评论

          本文标题:go 接口赋值和相等 需要注意的地方

          本文链接:https://www.haomeiwen.com/subject/iynynftx.html