接口

1.接口的定义

接口是一系列方法的集合。接口指定了一个类型应该要具有的方法,但是由该类型决定如何去实现这些方法。

2.鸭子接口

package main

import "fmt"

# 定义了一个鸭子接口
type Duck interface {
    run()
    speak()
}

#定义普通鸭子结构体
type PDuck struct {
    name string
    age string
}

func (p PDuck)run()  {
    fmt.Println("我是普通鸭子,我名字叫",p.name,"我走路歪歪扭扭")
}
func (p PDuck)speak()  {
    fmt.Println("我是普通鸭子,我名字叫",p.name,"我嘎嘎说话")
}

#定义一个唐老鸭,实现鸭子接口
type TDuck struct {
    name string
    age string
    wife bool
}

func (p TDuck)run()  {
    fmt.Println("我是普通鸭子,我名字叫",p.name,"我走路歪歪扭扭")
}
func (p TDuck)speak()  {
    fmt.Println("我是普通鸭子,我名字叫",p.name,"我嘎嘎说话")
}

func main() {
    pD:=PDuck{name:"水鸭子"}
    tD:=TDuck{name:"唐老鸭"}
    speak(tD)
    speak(pD)
}
func speak(p PDuck)  {
    p.speak()
}
func speak2(p TDuck)  {
    p.speak()
}
func speak(p Duck)  {
    p.speak()
}

#我想在函数中拿出唐老鸭的wife属性
//func speak(p Duck)  {
//    //类型断言,我断言你是TDuck类型,如果没有问题,转成TDuck类型
//    a:=p.(TDuck)
//    fmt.Println(a.wife)
//    p.speak()
//}

func speak(p Duck)  {
    switch a:=p.(type) {
    case PDuck:
        //判断好了,你是普通鸭子,把鸭子名字拿出来
        fmt.Println("你是普通鸭子")
        fmt.Println(a.name)
    case TDuck:
        //判断好了,你是唐老鸭,把唐老鸭的wife拿出来
        fmt.Println("你是唐老鸭")
        fmt.Println(a.wife)
    }
}

 3.空接口

  没有包含方法的接口称为空接口,空接口常表示为 interface{ }。由于空接口没有方法,因此所有类型都实现了空接口。

原文地址:https://www.cnblogs.com/blue-tea/p/12037304.html