如果❤️我的文章有帮助,欢迎点赞、关注。这是对我继续技术创作最大的鼓励。更多往期文章在我的个人博客
上一节我们讲了 Golang 接口概念 都是理论。正所谓光说不练假把式,归根结底要如何实现呢?我们接下来继续看:
接口语法格式
type 接口名 interface{
方法名1 ( 参数列表1 ) 返回值 1
方法名2 ( 参数列表2 ) 返回值 2
…
}
需要留意的是:
接口名
首字母、方法名
首字母 都是大写的时候,该方法能够被包(package)以外的代码调用。
举个例子:
type Filewriter interface{
Write([]byte) error
}
实现接口
Golang 语言要求只要 结构体
实现了接口中 全部方法
,就算继承了该接口。
换而言之,接口就是提供了一个约束,
约束
继承的结构体需要实现的方法列表
。
举个例子: 我们来定义一个接口 Speaker:
// Speaker 接口
type Speaker interface {
speak()
}
定义两个继承 Speaker
的结构体 Teacher
和 Student
:
type Teacher struct {}
type Student struct {}
安照 Golang 要求,只需要实现了接口 Speaker
中 全部方法
,就算继承了该接口。
因为接口 Speaker
中只有方法 speak()
,所以我们只需要给 Teacher
、Student
分别实现方法 speak()
就可以 继承接口 Speaker
// Teacher 实现了接口 Speaker
func (teacher Teacher) say() {
fmt.Println("Teacher speaking")
}
// Student 实现了接口 Speaker
func (student Student) say() {
fmt.Println("Student speaking")
}
以上实现了接口中的所有方法,就实现了这个接口。
继承接口作用
到这里可能会有疑问,如果 接口只是用来 约束
继承的结构体 需要实现的方法列表
。而且又是非强制
(毕竟你不实现全部方法也并不会像 java 那样报错),岂不是 君子协议
毫无强制约束
这里我是这么理解的:
从实现角度:结构体实现接口所有方法,即为继承接口 ,看待 接口
对 同类结构体
的写法上约束确实是非强制的。
但是:(此处应有重点)
从使用角度:**利用接口实现面向对象
概念中的多态,看待 接口
对 同类接口提
进行对外使用中可调用方法的约束
这里确实非常强制的。
举个例子:
package main
import "fmt"
// Speaker 接口
type Speaker interface {
speak()
}
// Teacher 实现了接口 Speaker
type Teacher struct {}
func (teacher Teacher) speak() {
fmt.Println("Teacher speaking")
}
// Student 实现了接口 Speaker
type Student struct {}
func (student Student) speak() {
fmt.Println("Student speaking")
}
func (student Student) chat() {
fmt.Println("Student chatting")
}
func main() {
var teackerSpeaker Speaker // 声明一个 Speaker 类型的变量 teackerSpeaker
teackerSpeaker = Teacher{} // 实例化 Teacher 并赋值给 teackerSpeaker
teackerSpeaker.speak() // 成功调用方法 speak() 输出:Teacher speaking
var studentSpeaker Speaker // 声明一个 Speaker 类型的变量 studentSpeaker
studentSpeaker = Student{} // 实例化 Student 并赋值给 studentSpeaker
studentSpeaker.speak() // 成功调用方法 speak() 输出:Student speaking
// studentSpeaker.chat() // 无法调用方法 chat(),因为接口 Speaker 内并无方法 chat()
}
从上面代码我们可以看出,即使 结构体 Student
实现了方法 chat
,但经过赋值给 类型 Speaker
变量后,也无法调用 方法 chat
。
这就是我所说,使用角度,多态限制了 同类结构体
可调用方法的强制约束