[Go語言]從Docker源碼學習Go——Interfaces

Interface定義:

type Namer interface {
    Method1(param_list) return_type
    Method2(param_list) return_type
    ...
}

注:ide

1. interface中不能包含變量spa

2. 一個類型不用顯式去定義實現某個接口,只要包含全部interface中定義的方法,這個類型就默認實現了這個接口指針

3. 多個類型能夠實現相同的接口code

4. 一個類型實現接口的同時,還能夠定義屬於本身的方法blog

5. 一個類型能夠實現多個接口接口

 

嵌套的interface

type ReadWrite interface {
    Read(b Buffer) bool
    Write(b Buffer) bool
}

type Lock interface {
    Lock()
    Unlock()
}

type File interface {
    ReadWrite
    Lock
    Close()
}

這樣File會包含ReadWrite和Lock中全部的方法it

 

判斷interface類型

v := varI.(T)
//varI must be an interface variable.

實例class

package lemon

type Shaper interface {
    Area() float32
}
type Square struct {
    Side float32
}

func (sq *Square) Area() float32 {
    return sq.Side * sq.Side
}

//use in main func.
func showInterfaceUsage() {
    sq1 := new(lemon.Square)
    sq1.Side = 5
    var areaIntf lemon.Shaper
    areaIntf = sq1

    if v, ok := areaIntf.(*lemon.Square); ok {
        fmt.Printf("The square has area: %f\n", v.Area())
    }
}

注意:方法的定義中傳的type爲指針,判斷時也要傳指針。變量

    switch areaIntf.(type) {
    case *lemon.Square:
        fmt.Printf("The square area is %f\n", areaIntf.Area())
    default:
        fmt.Printf("The default type")
    }

也能夠直接經過方法interface.(type)來得到接口的類型float

 

判斷類型是否實現了接口

...待續

相關文章
相關標籤/搜索