GO-接口

1、接口算法

一、定義app

interface類型能夠定義一組方法,用來表示一個對象的行爲特徵。interface不能包含任何變量。負載均衡

二、示例dom

好比:ide

type Animal interface {函數

  Talk(參數列表) 返回值列表spa

  Eat(參數列表) 返回值列表3d

  。。。code

}對象

三、interface類型是引用類型

type Animal interface{

  Talk(參數列表) 返回值列表

  。。。

}

var a Animal

a.Talk()

四、接口實現

a、Golang中的接口,不須要顯示的實現。只要一個對象,實現了接口中的全部方法,那麼這個對象就實現這個接口。

b、若是一個對象實現了多個interface類型的方法,那麼這個對象就實現了多個接口。

五、多態

一種事物的多種形態,均可以按照統一的接口進行操做。

六、空接口,interface{}

空接口沒有任何方法,因此全部類型都實現了空接口

var a int

var b interface

b = a

七、接口嵌套

一個接口能夠嵌套在另外的接口,以下所示:


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

type Lock interface{
    Lock()
    Unlock()
}

type File interface{
    ReadWrite
    Lock
    close()
}
八、類型斷言。若是咱們反向要知道這個接口變量裏面實際存儲的是哪一個類型的對象,能夠採用一下方法進行轉換:
var t int
var x interface{}
x = t
y,ok = x.(int) //轉成int, 帶檢查
 
九、練習,寫一個函數判斷傳入參數的類型
package main
import(
    "fmt"
)
func justify(items ...interface{}){
    for index,v := range items {
        switch v.(type) {
            case int:
                fmt.Printf("第 %d 個參數 is int\n",index)
            case int32:
                fmt.Printf("第 %d 個參數 is int32\n",index)
            case float32:
                fmt.Printf("第 %d 個參數 is float32\n",index)
        }
    }
}
func main(){
    var a int
    var b float32
    var c int32
    justify(a,b,c)
}
 
十、判斷一個變量是否實現了指定接口
 
十一、實現一個負載均衡調度算法,支持輪詢、隨機算法;
package main

import (
    "math/rand"
)

type RandBalance struct{

}

func (r *RandBalance) DoBalance(addList []string) string{
    l := len(addList)
    index := rand.Intn(l)
    return addList[index]
}
random.go
package main

type RoundBalance struct{
    curIndex int
}

func (r *RoundBalance) DoBalance(addrList []string) string{
    l := len(addrList)
    r.curIndex = r.curIndex % l
    addr :=  addrList[r.curIndex]
    r.curIndex++
    return addr
}
round.go
package main

type Balance interface{
    DoBalance([]string) string
}
balance.go
package main

import (
    "fmt"
    "math/rand"
)

func doBlance(blance Balance, addrList []string) string{
    return blance.DoBalance(addrList)
}

func main() {
    var addrList []string
    for i := 0;i < 10; i++{
        addr := fmt.Sprintf("%d.%d.%d.%d:80080",
        rand.Intn(255),rand.Intn(255),rand.Intn(255),rand.Intn(255))
        addrList = append(addrList,addr)
    }
    var balanceName string
    fmt.Scanf("%s", &balanceName)
    var balance Balance
    if balanceName == "random" {
        balance = &RandBalance{}
    } else if balanceName == "roundbrobin" {
        balance = &RoundBalance{}
    } else {
        balance = &RandBalance{}
    }

    for i := 0; i<10; i++{
        addr := doBlance(balance, addrList)
        fmt.Println(addr)
    }
}
main.go
相關文章
相關標籤/搜索