8.1 接口,接口也是一种类型

package main

import (
"errors"
"fmt"
)

/*
接口:接口指定了一个方法集,这是实现模块化的强大方式。可以将接口视为方法集的蓝本,它描述了方法集中的所有方法,但没有实现他们。
接口多种方式的实现,就想多态。多态就是多种形式,它让接口能够有多种实现。
接口声明方式: type ... interface{ 多个签名(也就是函数名)}


接口的要求:只要实现了它指定的方法集,且函数签名正确无误就可以了。
接口也是一种类型,可作为参数传递给函数,因此可编写可中用于多个接口实现的函数。

比如:定义一个数据库接口,只要实现了满足接口的要求,就可以使用任何数据库,因此可以轻松地更换数据库。
数据库接口可以包含多个实现,这就引入了多态的概念

多态意味着多种形式,它让接口能够有多种实现。

比如下例子中的:接口机器人,有个开关方法PowerOn(), 下面结构体都是实现了这个机器人的方法。
理解成: 接口定义了方法, 下面方法指向某个结构体,函数名就是接口的签名,那么这个结构体就实现了这个接口,属于这个接口多态中的一种。
*/


type Robot interface{
PowerOn() error //这个PowerOn叫做Robot的签名,一个签名就是一个定义的函数
}

type T850 struct{
Name string
}

func(a *T850)PowerOn()error{
return nil
}


type R2D2 struct{
Broken bool
}

func(r *R2D2)PowerOn()error{
if r.Broken{
return errors.New("R2D2 is broken ,this's open")
}else{
return nil
}
}


func Boot(r Robot)error{
return r.PowerOn()
}

func main(){
t:=T850{
Name:"The Terminator",
}
r:=R2D2{
Broken:true,
}

err:=Boot(&r)
if err !=nil{
fmt.Println(err)
}else{
fmt.Println("Robot is powered on!")
}

err=Boot(&t)
if err!=nil{
fmt.Println(err)
}else{
fmt.Println("Robot is powered on!")
}

}
原文地址:https://www.cnblogs.com/iifeng/p/11586156.html