GOGOUP-11. 接口和多态

万丈高楼平地起-接口和多态

一、接口基本定义和使用

  1. 多态就是同一个接口,使用不同的实例而执行不同操作。
  2. 官方术语:一个类型如果拥有一个接口需要的所有方法,那么这个类型就实现了这个接口。
  3. golang接口和dotnet 不同之处在于不需要显示的继承接口,只要实现接口的方法那么就认为实现了接口。通俗不严谨话会吃、会动、就是动物。
  4. 代码实例
    package main
    
    import "fmt"
    
    //定义一个动物接口
    type IAnimal interface {
    	Move()
    	Eat()
    }
    
    //定义个青蛙结构体
    type Frog struct {
    	Name string
    }
    
    func (frog *Frog) Move() {
    	fmt.Println(frog.Name, "可以跳着移动")
    }
    func (frog *Frog) Eat() {
    	fmt.Println(frog.Name, "吃害虫")
    }
    
    // 上面Frog 实现了IAnimal接口的所有方法,那么接口IAnimal就可以指向Frog实例对象
    
    //定义个青蛙结构体
    type Dog struct {
    	Name string
    }
    
    func (dog *Dog) Move() {
    	fmt.Println(dog.Name, "可以奔跑")
    }
    func (dog *Dog) Eat() {
    	fmt.Println(dog.Name, "吃骨头")
    }
    
    //上面Frog 实现了IAnimal接口的所有方法,那么接口IAnimal就可以指向Frog实例对象
    func AnimalShow(animal IAnimal) {
    	animal.Move()
    	animal.Eat()
    }
    
    func main() {
    	var an IAnimal
    	an = &Frog{"青蛙"}
    	AnimalShow(an)
    	an = &Dog{"狗"}
    	AnimalShow(an)
    }
    
    
  5. 执行结果
    GOGOUP-11. 接口和多态

二、inteface{}空接口

  1. 空接口是接口类型的特殊形式,空接口没有任何方法,因此任何类型都无须实现空接口。从实现的角度看,任何值都满足这个接口的需求。因此空接口类型可以保存任何值,也可以从空接口中取出原值。
  2. Show Your Code
    package main
    
    import "fmt"
    
    type EmptyIf interface{}
    
    //应为空接口没有方法、默认所有类型都实现了空接口。Show这个方法可以接收任何类型的参数
    func Show(em EmptyIf) {
    	fmt.Println(em)
    	//断言 推断参数是否string类型
    	x, ok := em.(string)
    	if ok {
    		fmt.Println("接收到的参数是string 类型", x)
    	}
    	//空接口断言
    }
    
    type Stu struct {
    	Name string
    }
    
    func main() {
    	Show(11)
    	Show("小明")
    	Show(Stu{"小红"})
    }
    
    
  3. 执行结果
    GOGOUP-11. 接口和多态
上一篇:Frogger


下一篇:CF625E Frog Fights