1. 程式人生 > >GO開發:接口

GO開發:接口

blog failed method println false clas 指針 AC 通用

接口

接口定義

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()
}      

GO開發:接口