接口
	接口定义
	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\n",a,a)
	    fmt.Printf("%d %T\n",b,b)
	    fmt.Printf("%d %T\n",c,c)
	 
	    var st Student = Student{
	        Name: "stu01",
	        Sex:  "female",
	    }
	    Test(st)
	    fmt.Printf("%T\n",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\n”, 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()
	}      
	软件定制,博远电子,友情提醒。
			 
			
				
				 来源:抚顺市博远电子,如涉及版权问题请与我们联系。
				
				
					
					
						
TAG
						软件定制,软件开发,瀚森HANSEN,辽宁,沈阳,抚顺