---------
只要学不去世,就往去世里学! ----狂神
---------

在支持面向工具的措辞里,基本上都有接口观点, 接口的定义:它是定义一个工具的行为,详细的实现细节,由工具本身确定
接口的关键字:interface
接口的声明与实现//声明 一个接口
type Person interface{
eat()
}
//创建一个构造体,仿照一个类,在go措辞中没有class的观点!
type Man struct{
name string
}
//这里是Man类型实现了接口里的方法eat(),也就可以说它实现了接口(这里须要全部实现了接口里的方法,才是实现了接口)
func (p Man) eat() {
fmt.Println(p.name,",有好吃的吗?")
}
//实现
func main() {
var v Person
man :=Man{name: "test"}
//这里把稳,由于man是实现了Person的接口,要不是会报错的
v=man
v.eat()
}
总结
//1.go里面没有implement关键字
//2.只假如类型实现了接口里的所有方法,就可以说是它是实现了这个接口
实际运用//举个实际中的例子,在项目里,我们有个一个针对不同等级的会员,积司帐算的办法会有些不同,这个场景是非常得当用接口来办理的,
//定义一个打算积分的接口,不同的等级会员都实现自己的打算方法就可以
//定义一个打算积分的接口
type CalcPoint interface{
calc() float64
}
//定义一个普通会员的构造体
type ComMember struct{
name string
score float64
}
func (c ComMember) calc() float64 {
return c.score+10
}
//定义一个高等会员的构造体
type GoldMember struct{
name string
score float64
}
func (g GoldMember) calc() float64 {
return g.score+20
}
//这里就简化了,这里做个无用功能吧,便是打算下,所有人的积分总和是多少
//定义一个吸收calcPoint类型参数的 函数
func getTotalScore(members []CalcPoint) {
total :=0.00
for _, member := range members {
total =total+member.calc()
}
fmt.Println("总积分",total)
}
func main() {
//创建一个普通会员
member1 :=ComMember{
name: "ton",
score: 78,
}
//创建一个高等会员
member2 :=GoldMember{
name: "uzi",
score: 89,
}
members :=[]CalcPoint{member1,member2}
getTotalScore(members) // 返回值197
}
空接口空接口:没有包含方法的接口,以是在go措辞中,所有的类型都是空接口
表示方法:interface{}
类型断言//类型断言
i.(T) //接口i的详细类型T
//
func main(){
var s interface{}="abc"
a,ok :=s.(string)//a=>值,ok,如果断言成功,返回true,否则返回false
fmt.Println(a,ok)
}
//利用switch case进行类型选择
func findType(i interface{}){
switch i.(type){ //把稳这里i.(type)
case int:
fmt.Println("int")
case string:
fmt.Println("string")
case float64:
fmt.Println("float64")
default:
fmt.Println("没有找到")
}
}
实现接口的方法:指针吸收者和值吸收者
结论
如果吸收者类型为指针,则吸收者的值只能是指针
如果吸收者类型为值类型,则吸收者的值可以是指针或者是值
代码解释
package main
import "fmt"
type notifier interface{
notify()
}
func sentNotify(n notifier) {
n.notify()
}
type User struct{
name string
}
func (u User) notify() {//这里的值是指针类型吸收者
fmt.Println("user中的notify")
}
//如果这个值是值类型吸收者时,在调用这个sentNotify()函数传参数时,可以是指针类型或者是值类型都可以
func (u User) notify() {//这里的值是指针类型吸收者
fmt.Println("user中的notify")
}
func main() {
u:=User{
name: "abc",
}
//sentNotify(u)//这里是报错的 cannot use u (type User) as type notifier in argument to sentNotify:
// User does not implement notifier (notify method has pointer receiver)
//这意思也是说 这个接口方法吸收指针类型的值,你给一个值类型的参数是不可以的
//须要传指针类型的值
sentNotify(&u)
}