• go语言之接口二


    接口查询:

    先来看如下的结构。结构体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)

    }

     

  • 相关阅读:
    【洛谷】P2880 [USACO07JAN]平衡的阵容Balanced Lineup(st表)
    【洛谷】P1052 过河(状压dp)
    【洛谷】P1541 乌龟棋(四维背包dp)
    【BZOJ】4721: [Noip2016]蚯蚓 / 【洛谷】P2827 蚯蚓(单调队列)
    【洛谷】P1064 金明的预算方案(dp)
    【洛谷】P3908 异或之和(异或)
    【洛谷】P2434 [SDOI2005]区间(暴力)
    【洛谷】P2694 接金币(排序)
    【BZOJ】1012: [JSOI2008]最大数maxnumber /【洛谷】1198(线段树)
    【游记】noip2017酱油记
  • 原文地址:https://www.cnblogs.com/zhanghongfeng/p/10005621.html
Copyright © 2020-2023  润新知