前言

看【Go语言实战】这本书第二遍了,看第一遍的时候只是留下个印象,为了加深记忆以及方便回顾,把自己的理解写出来,仅供参考,Go Go Go,开始

定义

接口是用来定义行为的类型。这些被定义的行为不由接口直接实现,而是通过方法由用户 定义的类型实现。如果用户定义的类型实现了某个接口类型声明的一组方法,那么这个用户定 义的类型的值就可以赋给这个接口类型的值。这个赋值会把用户定义的类型的值存入接口类型 的值。

值接受者与指针接受者

1、如果参数类型是指针,那么在调用的时候也必须传递指针地址,因为编译器不是总能自动获取一个值的地址
2、如果参数类型是值,那调用的时候传值或者指针都可以,因为通过指针可以获取到对应的值


接口实现多态的方式

1、定义一个接口,接口中定义一个方法,所有想要实现该接口的类型,必须先实现接口中的方法
2、定义一个类型,并为该类型以接收者方式实现【步骤1】中的接口方法
3、声明一个多态方法,接收的参数类型为【步骤1】中定义的接口类型
4、调用该多态方法,并把【步骤2】中定义的类型作为参数传递给【步骤3】中声明的多态方法,由多态方法来调用接口方法

具体代码如下:
package main

func main() {
    u := user{
        "dabao",
        "baojun3@staff.weibo.com",
    }
    //调用多态方法notification
    notification(u)

    //嵌入类型 使用嵌入类型可以实现继承,admin中内部类型user的方法也被提升到了外部类型admin
    admin := admin{
        user{
            "张三",
            "zhangsan@aa.com",
        },
        "level",
    }
    notification(admin)
}

//定义一个接口
type notifier interface {
    notify()
}

//定义一个user类型
type user struct {
    name  string
    email string
}

//定义一个admin类型,将user类型嵌入
type admin struct {
    user
    level string
}

//user类型实现notifier接口
func (u user) notify() {
    println("通过接口实现多态调用notify方法:" + u.name)
}

//声明一个多态方法
func notification(n notifier) {
    n.notify()
}