什么是接口

在面向对象的领域里,接口一般这样定义:接口定义一个对象的行为。接口只指定了对象应该做什么,至于如何实现这个行为(即实现细节),则由对象本身去确定。

接口是一系列方法的集合

例如:鸭子会叫会跑,叫起来像,跑起来像就是鸭子

语法

type 接口名 interface{
    方法一
 方法二
}
package main

import "fmt"

type Duck interface{  //定义一个鸭子接口
    speak()
    run()
}
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(pD)
    speak(tD)
}

func speak(p Duck){  //只要是鸭子类型就能说话
    p.speak()
}

类型断言

类型断言用于提取接口的底层值(Underlying Value)。

在语法 i.(T) 中,接口 i 的具体类型是 T,该语法用于获得接口的底层值。

就比如上面的旱鸭子就是鸭子类型

package main

import "fmt"

type Duck interface{  //定义一个鸭子接口
    speak()
    run()
}
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() {
    tD:=TDuck{name:"旱老鸭"}
    speak(tD)

}
func speak(p Duck)  {
    //类型断言,我断言你是TDuck类型,如果没有问题,转成TDuck类型
    a:=p.(TDuck)
    fmt.Println(a.wife)
    p.speak()
}

类型选择

类型选择用于将接口的具体类型与很多 case 语句所指定的类型进行比较。它与一般的 switch 语句类似。唯一的区别在于类型选择指定的是类型,而一般的 switch 指定的是值。

类型选择的语法类似于类型断言。类型断言的语法是 i.(T),而对于类型选择,类型 T 由关键字 type 代替。

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

        fmt.Println(a.wife)


    }
}

匿名空接口

所有的数据类型都实现了空接口
package main

import "fmt"

type Empty interface {

}
type TDuck2 struct {
    name string
    age string
    wife bool
}
func main() {
    test(1)
    test("ssss")
    test(TDuck2{})
    test(10.45)


}

func test(a interface{})  {
    switch a.(type) {
    case int:
        fmt.Println("你是int类型")
    case string:
        fmt.Println("你是string ")
    case TDuck2:
        fmt.Println("你是唐老鸭")
    default:
        fmt.Println("我不知道你是什么类型")

    }
}
12-19 16:36