//接口类型是一种抽象类型,他不会暴露所代表的对象的内部直的结构和这个对象支持的基础操作的集合,它们只展示自己的方法.因此接口类型不能将其实例化
//接口类型描述了一些列的方法的集合
//接口类型名通常以"er"结尾
package main
import "fmt"
type Hummaner interface {
sing() //声明一个方法,并没有实现
}
type Student struct {
id int
name string
}
type Myi int
type Mys string
func (s Mys) sing() {
fmt.Println("字符串在唱歌!!!")
}
func (i Myi) sing() {
fmt.Println("整型在唱歌!!!")
}
func (p Student) sing() {
fmt.Println("结构体在唱歌!!!")
}
//多态的实现
func WhoSing(h Hummaner) { //接口变量当形参
h.sing()
}
func main() {
//只能是自定义变量,或者结构体变量来调用接口中的方法
//go中基本基本类型变量不可以调用,接口中的方法
// var i int
// i.sing()//错误,即是定义相关类型的函数,也调用不了
/*
1.先定义一个接口变量,.然后定义一个结构体或自定义变量
2.把结构体或自定义变量赋值给接口变量
*/
var h Hummaner
var s Mys
h = s
h.sing() ///字符串在唱歌!!!
s.sing()
var i Myi
i.sing()
var p Student = Student{1, "zhao"}
p.sing()
//多态的实现
WhoSing(s)
WhoSing(i)
WhoSing(p)
//定义一个切片,其类型是结口
x := make([]Hummaner, 3)
x[0], x[1], x[2] = i, s, p
for _, value := range x {
value.sing()
}
//接口就是一组抽象类型的集合,他必须由其他非接口类型实现,而不能自我实现
//而且实现接口的接受者参数不能是基本类型,结构体或自定义类型皆可
}