- 接口是一种规范与标准,只是规定了要做哪些事情。但是具体怎么做,是实现接口的类去做的,接口只是把所有具有共性的方法定义在一起。
- 接口存在的意义就是用来定义规范,用来做功能的拓展
- 接口最大的好处是可以实现多态
- 在Golang中只要接口中的方法和结构体重的一样,就会认为这么结构体实现了这个接口的方法
- 在这里还是要吐槽一下,Go的语法是真的丑,如果你是Java转过来的,就会发现,垃圾的一批
定义格式:
tepe 接口名 interface{
方法 返回值类型
}
调用格式1:
对象名.方法名
调用格式2:这种方式必须实现接口中声明的所有方法
通过接口变量调用
演示:
func main() {
// 对象名.方法名
var stu Student
stu.Hello() // Student类实现了接口的Hello方法
var tea Teacher
tea.Hello() // Teacher类实现了接口的Hello方法
// 通过接口变量调用,如果接口中有两个方法,但是只实现了一个,就会报错,必须全部实现
var testInterface TestInterface
testInterface = &stu
testInterface.Hello() // Student类实现了接口的Hello方法
testInterface = &tea
testInterface.Hello() // Teacher类实现了接口的Hello方法
}
type Student struct{}
type Teacher struct{}
type TestInterface interface {
Hello()
}
func (student *Student) Hello() {
fmt.Println("Student类实现了接口的Hello方法")
}
func (teacher *Teacher) Hello() {
fmt.Println("Teacher类实现了接口的Hello方法")
}
多态:
- 多态是指同一行为,具有多个不同表现形式
- 多态是一同一个接口,使用不同的实例执行不同的操作
- 多态是除封装、继承之后面向对象的第三大特征。
- 多态是出现在接口关系中的(只能是接口)
- 举例:win电脑和Mac都是电脑(接口),但是mac只能办公用,win可以办公可以玩游戏,不同类型的电脑具有不同的特征,就是多态
多态的实现:
func 函数名 (参数 接口类型){}
演示:
func main() {
var stu Student
var tea Teacher
// 多态
Polymorphic(&stu) //Student类实现了接口的Hello方法
Polymorphic(&tea) // Teacher类实现了接口的Hello方法
}
type Student struct{}
type Teacher struct{}
type TestInterface interface {
Hello()
}
func (student *Student) Hello() {
fmt.Println("Student类实现了接口的Hello方法")
}
func (teacher *Teacher) Hello() {
fmt.Println("Teacher类实现了接口的Hello方法")
}
func Polymorphic(polymorphic TestInterface) {
polymorphic.Hello()
}
接口的继承与转换:
接口的继承和普通继承是一样的,直接写接口名就可以了
演示:
func main() {
var stu Student
var test02 TestInterface02
test02 = &stu
test02.Hello()
test02.HelloHello() // 可以调用所继承接口中的方法
var test TestInterface
test = test02
test.Hello()
}
type Student struct{}
type Teacher struct{}
type TestInterface interface {
Hello()
}
type TestInterface02 interface {
TestInterface // 继承第一个接口
HelloHello()
}
func (student *Student) Hello() {
fmt.Println("Hello")
}
func (student *Student) HelloHello() {
fmt.Println("HelloHello")
}
空接口定义及使用:
空接口(interface {})不包含任何的方法,正因为如此,所有的类型都实现了空接口,因此空接口可以存储任意类型的数值
演示:
func main() {
// 定义空接口的切片,由于是空接口所以可以存储任意类型的数据
var s []interface{}
s = append(s, 1, 2, 3, "字符串", 1.1, true)
fmt.Println(s)
}
类型断言:
通过类型断言,可以判断空接口中存储的数据类型
定义格式:
value,ok:=m.(T)
- value:表示变量m的值
- ok:表示布尔类型变量,如果断言成功为true,否则为false
- m:表示空接口类型的变量
- T:表示断言的类型
- 如果m
演示:
func main() {
var i interface{}
i = 123
// 如果i是int类型就会把结果赋值给ok,把数据(123)赋值给value
value, ok := i.(int)
// 如果是123就会打印断言成功,不是123就会打印断言失败
if ok {
fmt.Println("断言成功:", value)
} else {
fmt.Println("断言失败")
}
}



