背景
在平常的工作中长看到一些Go程序员使用interface,但实际并不是很了解,趁着假期学习一波。了解其中的使用原理,也可以提高自己阅读代码的能力和提高编写效率。
参考:https://liujiacai.net/blog/2020/03/14/go-struct-interface/
参考:https://segmentfault.com/a/1190000018865258
参考:https://sanyuesha.com/2017/07/22/how-to-understand-go-interface/
interface的关键点
关键点1 interface 是一种类型
首先 interface 是一种类型,从它的定义可以看出来用了 type 关键字,更准确的说 interface 是一种具有一组方法的类型,这些方法定义了 interface 的行为。
go 允许不带任何方法的 interface ,这种类型的 interface 叫 empty interface。
关键点2 interface存储的是传入者的值
具体可看下方的代码
package main
import "fmt"
type carMove interface {
SetName()
GetName() string
}
type bwmCarStruct struct {
name string
}
func (car *bwmCarStruct) SetName() {
car.name = "别摸我"
}
func (car *bwmCarStruct) GetName() string {
return car.name
}
type bcCarStruct struct {
name string
}
func (car *bcCarStruct) SetName() {
car.name = "奔驰"
}
func (car *bcCarStruct) GetName() string {
return car.name
}
func allCarMov(i carMove){
i.SetName()
}
func main () {
bmwCar:=bwmCarStruct{}
fmt.Println(bmwCar)
allCarMov(&bmwCar)
fmt.Println(bmwCar)
bcCar:=bcCarStruct{}
fmt.Println(bcCar)
allCarMov(&bcCar)
fmt.Println(bcCar)
}
-----------------------------
output
{}
{别摸我}
{}
{奔驰}
关键点3 可以判断具体传入的结构体名称,并个性化修改
主要修改了allCarMov这个方法
func allCarMov(i carMove){
i.SetName()
if t, ok := i.(*bcCarStruct); ok {
fmt.Println("命中奔驰", t)
}
if t, ok := i.(*bwmCarStruct); ok {
fmt.Println("命中宝马", t)
}
}
------------------------
output
{}
命中宝马 &{别摸我}
{别摸我}
{}
命中奔驰 &{奔驰}
{奔驰}