go语言之接口二

mac2022-06-30  71

接口查询:

先来看如下的结构。结构体File实现了Read,Writer,Seek,Close的方法

type File struct{

}

 

func (f *File) Read(buf []byte)(n int,err error){

        return n,err

}

 

func (f *File) Write(buf []byte)(n int,err error){

        fmt.Println("writer function")

        return n,err

}

 

 

func (f *File) Seek(buf []byte)(n int,err error){

        return n,err

}

 

 

func (f *File) Close(buf []byte)(n int,err error){

        return n,err

}

在IStream的结构中定义了Write,Read方法。

type IStream interface{

        Write(buf []byte)(n int,err error)

        Read(buf []byte)(n int,err error)

}

来看下面的这种赋值。将File实例赋值给file1, 然后将file1赋值给file2

var file1 IStream=new(File)

var file2 Writer=file1

通过下面的语句就可以分别判断file1接口指向的对象是否实现了File以及file2接口指向的对象是否实现了IStream接口. 如果实现了,则执行特定的代码。

if file5,ok:=file1.(*File);ok{

                 fmt.Println(ok)

                 fmt.Println(file5)

        }

if file7,ok:=file2.(IStream);ok{

                 fmt.Println(ok)

                 fmt.Println(file7)

        }

 

类型查询:

在Go语言中,还可以更加直截了当询问接口指向的对象实例的类型。例如下面:

下面的分别判断file1以及v1的类型。根据不同的类型走不同的分支判断。

switch v:=file1.(type){

        case IStream:

                 fmt.Println(v)

}

 

var v1 interface{}=value

        fmt.Println(v1)

        switch v:=v1.(type){

        case int:

                 fmt.Println(v)

}

 

接口组合:

type IReader interface{

        Read(buf []byte)(n int,err error)

}

 

type IWriter interface{

        Write(buf []byte)(n int,err error)

}

ReadWriter接口将基本的Read和Write方法组合起来

type ReadWriter interface{

        IReader

        IWriter

}

下面的这个写法也是一样的效果。这两种写法的表意完全相同:ReadWriter接口既能做Reader接口的所有事情,又能做Writer接口的所有事情

type ReadWriter interface{

        Read(buf []byte)(n int,err error)

        Write(buf []byte)(n int,err error)

}

 

转载于:https://www.cnblogs.com/zhanghongfeng/p/10005621.html

最新回复(0)