接口
一个自定义类型,描述了一系列方法的集合
- 接口不能实例化
接口的定义
- 接口习惯以er结尾
- 接口只有方法声明没有实现、没有数据字段
- 接口可以匿名嵌入其他接口,或嵌入到结构中
type Humaner interface {
SayHi(num int)
}
type Student17 struct {
studentId int
}
func (student Student17) SayHi(num int) {
fmt.Printf("%+v\n", student)
}
func main() {
var inter Humaner17
student := Student17{1}
inter = student
inter.SayHi(1)
}
接口继承
type Personer interface {
Humaner
sing(name string)
}
func (student *Student17) sing(namee string) {
fmt.Printf("I'm singing.\n")
}
多态
方法中传入接口参数,每次调用方法都会动态加载接口调用的方法
func WhoSayHi(inter Humaner) {
inter.SayHi(1)
}
接口转化
- 超集可以转化为子集
- 子集不能转化为超集
空接口
- 没有声明方法的接口,可以保存任何的值
func MyFunc(args ...interface{}) {
]
可以接受任意多个参数,类型、数量不限
在打印函数中出现过
类型断言(只能用来断言接口类型)
value(返回的值), ok(返回类型是否正确) := 待判断的变量.(待判断的类型)
value(返回的值) := data.(type)//获得变量的类型
例如:
value, ok := student.(Student17)//1, true
if value, ok := student.(int); ok == true {
fmt.Printf("%d\n", value)
}
switch value := student.(type) {
case int:
fmt.Println(value)
}