type File struct { // ... } func (f *File) Read(buf []byte) (n int, err error) func (f *File) Write(buf []byte) (n int, err error) func (f *File) Seek(off int64, whence int) (pos int64, err error) func (f *File) Close() error type IFile interface { Read(buf []byte) (n int, err error) Write(buf []byte) (n int, err error) Seek(off int64, whence int) (pos int64, err error) Close() error } type IReader interface { Read(buf []byte) (n int, err error) } type IWriter interface { Write(buf []byte) (n int, err error) } type ICloser interface { Close() error } //尽管这里File没有显示地继承接口,甚至不知道这些接口的存在 //但是,只要File实现了该接口的函数,即可访问和赋值 var file1 IFile = new(File) var file2 IReader = new(File) var file3 IWriter = new(File) var file4 ICloser = new(File)
接口赋值
接口赋值在Go语言中分为如下两种情况:
将对象实例赋值给接口;
将一个接口赋值给另一个接口。
首先看第一个方法
interface Integer int func (a Integer) Less (b Integer) bool{ return a < b } func (a *Integer ) Add (b Integer) { *a+=b } type LessAdder interface{ Less(b Integer) bool Add(b Integer) } var a Integer=1 //yes var b LessAdder = &a //no var b LessAdder = a
原因在于 go语言可以根据
func (a Integer) Less (b Integer) bool{ return a < b }
自动生成
func (a *Integer) Less (b Integer) bool{ return *a < b }反之则不然
第二种方法
package one type ReadWriter interface{ Read(buf [] byte)(n int, err error) Write(buf [] byte)(n int, err error) } package two type IStream interface{ Read(buf [] byte)(n int, err error) Write(buf [] byte)(n int, err error) } var file1 one.ReadWriter = new(File) var file2 two.IStream = file1 var file3 one.ReadWriter =file2 //因为IWriter的方法列表是ReadWrtier方法列表的子集,所以可以将ReadWriter赋值给IWriter var file4 IWriter = file3
接口查询
爱上地方
有疑问加站长微信联系(非本文作者)