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
相关文章
相关标签/搜索