Golang 接口实现

Golang 接口实现

Posted by 锐玩道 on April 18, 2021

如果❤️我的文章有帮助,欢迎点赞、关注。这是对我继续技术创作最大的鼓励。更多往期文章在我的个人博客

上一节我们讲了 Golang 接口概念 都是理论。正所谓光说不练假把式,归根结底要如何实现呢?我们接下来继续看:

接口语法格式

type 接口名 interface{
    方法名1 ( 参数列表1 ) 返回值 1
    方法名2 ( 参数列表2 ) 返回值 2
    …
}

需要留意的是:

接口名首字母、方法名首字母 都是大写的时候,该方法能够被包(package)以外的代码调用。

举个例子:

type Filewriter interface{
    Write([]byte) error
}

实现接口

Golang 语言要求只要 结构体 实现了接口中 全部方法,就算继承了该接口。

换而言之,接口就是提供了一个约束,约束继承的结构体需要实现的方法列表

举个例子: 我们来定义一个接口 Speaker:

// Speaker 接口
type Speaker interface {
    speak()
}

定义两个继承 Speaker 的结构体 TeacherStudent

type Teacher struct {}

type Student struct {}

安照 Golang 要求,只需要实现了接口 Speaker全部方法,就算继承了该接口。 因为接口 Speaker 中只有方法 speak() ,所以我们只需要给 TeacherStudent 分别实现方法 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

这就是我所说,使用角度,多态限制了 同类结构体 可调用方法的强制约束