zoukankan      html  css  js  c++  java
  • GO开发:接口

    接口

    接口定义

    Interface类型可以定义一组方法,但是这些不需要实现。并且interface不能包含任何变量。

    type example interface{
            Method1(参数列表) 返回值列表
            Method2(参数列表) 返回值列表
            …
            var a example
            a.Method1()
    }
    

    interface类型默认是一个指针

    接口实现:

    a. Golang中的接口,不需要显示的实现。只要一个变量,含有接口类型中的所有方法,那么这个变量就实现这个接口。因此,golang中没有implement类似的关键字

    b. 如果一个变量含有了多个interface类型的方法,那么这个变量就实现了多个接口。

    c.如果一个变量只含有了1个interface的方部分方法,那么这个变量没有实现这个接口。

    接口嵌套

    一个接口可以嵌套在另外的接口,如下所示

     type ReadWrite interface {
                   Read(b Buffer) bool
                   Write(b Buffer) bool
    } 
    type Lock interface {
                   Lock()
                   Unlock() 
    } 
    type File interface {
                   ReadWrite
                   Lock 
                   Close() 
    } 
    

    实例:

    package main
    
    import "fmt"
    
    type Reader interface {
       Read()
    }
    
    type Writer interface {
       Write()
    }
    
    type ReadWriter interface {
       Reader
       Writer
    }
    
    type File struct {
    }
    
    func (f *File) Read() {
       fmt.Println("read data")
    }
    
    func (f *File) Write() {
       fmt.Println("write data")
    }
    
    func Test(rw ReadWriter) {
       rw.Read()
       rw.Write()
    }
    
    func main() {
       var f *File
       Test(f)
    
       var b interface{}
       b = f
       v, ok := b.(ReadWriter)
       fmt.Println(v, ok)
    }
    

    类型断言

    由于接口是一般类型,不知道具体类型,如果要转成具体类型,可以采用以下方法进行转换:

    /*
    var t int
    var x interface{}
    x = t
    y = x.(int)   //转成int
    
    var t int
    var x interface{}
    x = t
    y, ok = x.(int)   //转成int,带检查
    */
    package main
    
    import "fmt"
    
    type Student struct {
    	Name string
    	Sex  string
    }
    
    func Test(a interface{}) {
    	b, ok := a.(Student)
    	if ok == false {
    		fmt.Println("convert failed")
    		return
    	}
    	//b += 3
    	fmt.Println(b)
    }
    
    func main()  {
    	var a interface{}
    	var b int
    	a = b
    	c := a.(int)
    	fmt.Printf("%d %T
    ",a,a)
    	fmt.Printf("%d %T
    ",b,b)
    	fmt.Printf("%d %T
    ",c,c)
    
    	var st Student = Student{
    		Name: "stu01",
    		Sex:  "female",
    	}
    	Test(st)
    	fmt.Printf("%T
    ",st)
    }
    

    类型断言,采用type switch方式

    空接口Interface{}

    nterface{},接口中一个方法也没有,所以任何类型都实现了空接口,也就是任何变量都可以赋值给空接口。

    var a int
    var b interface{}
    b  = a
    

    判断一个变量是否实现了指定接口

     type Stringer interface {
            String() string 
    }
    var v MyStruct
    if sv, ok := v.(Stringer); ok {
           fmt.Printf(“v implements String(): %s
    ”, sv.String()); 
    } 
    

    实现一个通用的链表类

    package main
    
    import "fmt"
    
    type LinkNode struct {
       data interface{}
       next *LinkNode
    }
    
    type Link struct {
       head *LinkNode
       tail *LinkNode
    }
    
    func (p *Link) InsertHead(data interface{}) {
       node := &LinkNode{
          data: data,
          next: nil,
       }
    
       if p.tail == nil && p.head == nil {
          p.tail = node
          p.head = node
          return
       }
    
       node.next = p.head
       p.head = node
    }
    
    func (p *Link) InsertTail(data interface{}) {
       node := &LinkNode{
          data: data,
          next: nil,
       }
    
       if p.tail == nil && p.head == nil {
          p.tail = node
          p.head = node
          return
       }
    
       p.tail.next = node
       p.tail = node
    }
    
    func (p *Link) Trans() {
       q := p.head
       for q != nil {
          fmt.Println(q.data)
          q = q.next
       }
    }
    
    func main() {
       var link Link
       for i := 0; i < 10; i++ {
          //intLink.InsertHead(i)
          link.InsertTail(fmt.Sprintf("str %d", i))
       }
       link.Trans()
    }      
    
  • 相关阅读:
    Chrome浏览器另存为时浏览器假死问题
    excel的新增日期快捷键Ctrl+;失效解决办法
    制作Visual Studio 2019 (VS 2019) 离线安装包
    Sysinternals Suite 工具包使用指南
    如何关闭Acrobat Reader DC自动更新
    MySql like模糊查询使用详解
    注册表删除我的电脑WPS云盘图标
    解除Word文档的限制编辑!
    IIS Ftp端口设置
    [UnityShader基础]12.坐标空间
  • 原文地址:https://www.cnblogs.com/ningxin18/p/8467385.html
Copyright © 2011-2022 走看看