一、接口
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] }
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 }
package main type Balance interface{ DoBalance([]string) string }
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) } }