关于go语言的interface(接口)的理解小记 2020.11.2

main.go:

package main

import "fmt"

type Book interface {//定义一个接口,里面有两个方法 fanshu() 和 bishu()
   fanshu()
   bishu()
}

type Book01 struct {//定义一个Book01类型的接口体,里面有一个Name属性(字段)
   Name string
}

func (book01 Book01) fanshu(){//代表着book01就是一个Book类型的接口,因为它实现了fanshu()和bishu()的方法功能
   fmt.Println("正在翻书中......~~~~")
}

func (book01 Book01) bishu(){
   fmt.Println("正在闭书中......~~~~")
}

type Bookin struct {

}
func (bookin *Bookin) say(book Book){
   book.fanshu()
   book.bishu()
}



func main(){
   book01 := Book01{"kobe"}
   bookin := Bookin{}
   bookin.say(book01)
}

 

运行结果是:

实现了接口的应用。

此时我把

这里的Book01类型前面加上*,也就是变成Book01指针类型,如下图:按照以往的时候,因为go语言底层会自从给我们加上&或者*,所以我们为了利用指针的高效性质,高效传递性,直接就写成了*类型的模式,但是这个时候如果改变后,这里会发生错误,具体如下:

此时当我们在主函数(main)里调用book01接口的时候,IDE出现了错误,我们来看看是报了什么错误?

由编译器的推荐修改可知,我们这里如果加上一个&符号就可以了,那么说明这里传进去的应该是指针类型,而不是Book01类型,分析:因为在之前我们写方法的时候,我们传进去的参数是*Book01类型的,所以这个时候,我们是对*Book01类型实现了接口的方法,我们在主函数里传进去的应该是对应的指针类型!

如果我们把*去掉,那么我们就是对Book01实现了接口方法,那么在主函数里调用的时候就传的是Book01类型的,也就是book01。