• GO-接口


    一、接口

    1、定义

    interface类型可以定义一组方法,用来表示一个对象的行为特征。interface不能包含任何变量。

    2、示例

    比如:

    type Animal interface {

      Talk(参数列表) 返回值列表

      Eat(参数列表) 返回值列表

      。。。

    }

    3、interface类型是引用类型

    type Animal interface{

      Talk(参数列表) 返回值列表

      。。。

    }

    var a Animal

    a.Talk()

    4、接口实现

    a、Golang中的接口,不需要显示的实现。只要一个对象,实现了接口中的所有方法,那么这个对象就实现这个接口。

    b、如果一个对象实现了多个interface类型的方法,那么这个对象就实现了多个接口。

    5、多态

    一种事物的多种形态,都可以按照统一的接口进行操作。

    6、空接口,interface{}

    空接口没有任何方法,所以所有类型都实现了空接口

    var a int

    var b interface

    b = a

    7、接口嵌套

    一个接口可以嵌套在另外的接口,如下所示:


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

    type Lock interface{
        Lock()
        Unlock()
    }

    type File interface{
        ReadWrite
        Lock
        close()
    }
    8、类型断言。如果我们反向要知道这个接口变量里面实际存储的是哪个类型的对象,可以采用一下方法进行转换:
    var t int
    var x interface{}
    x = t
    y,ok = x.(int) //转成int, 带检查
     
    9、练习,写一个函数判断传入参数的类型
    package main
    import(
        "fmt"
    )
    func justify(items ...interface{}){
        for index,v := range items {
            switch v.(type) {
                case int:
                    fmt.Printf("第 %d 个参数 is int ",index)
                case int32:
                    fmt.Printf("第 %d 个参数 is int32 ",index)
                case float32:
                    fmt.Printf("第 %d 个参数 is float32 ",index)
            }
        }
    }
    func main(){
        var a int
        var b float32
        var c int32
        justify(a,b,c)
    }
     
    10、判断一个变量是否实现了指定接口
     
    11、实现一个负载均衡调度算法,支持轮询、随机算法;
    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
     
  • 相关阅读:
    delphi Int64Rec 应用实例
    PerformEraseBackground 擦除背景(ThemeServices)
    Delphi 的 Bit
    delphi 关于 "高位" 与 "低位"
    PByte和PChar的关系
    执行控制台程序并且获得它的输出结果
    Console下Pause效果的函数
    ByteType字符串中判断是否英文
    窗体包括标题作为一个位图复制到剪贴板
    inf 启动
  • 原文地址:https://www.cnblogs.com/willpower-chen/p/8310749.html
Copyright © 2020-2023  润新知