第一個接口:
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語言中,這兩個接口實際上并無區(qū)別,因為: ? 任何實現(xiàn)了one.ReadWriter接口的類,均實現(xiàn)了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。例如,假設(shè)我們有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()方法。