Go 语言中的接口
在所有编程语言中,接口都是一些方法的集合,通常都是"类"们都需要实现的一些公共方法。使这些"类"在使用过程中多了一层抽象。在使用接口时无需在意这些方法是如何实现的,只需在意这个接口中的方法本身。Go 语言提倡面向接口编程,一来增强代码的可读性,二来可以使代码的模块之间的关系变得更加清晰、边界更加明显。本文就来介绍一下 Go 语言中的接口。
1. 接口定义
在 Go 语言中,接口也是一个数据类型,该类型使用结构 interface{...}
来定义。
代码示例:
代码块
- 1
var stuInterface interface{
- 2
PrintAge()
- 3
}
以上代码定义可一个接口类型的变量,其中包含的方法为 PrintAge()。
2. 接口实现
了解了 Go 语言中接口的定义之后,我们来学习一下如何实现Go语言的接口。
在 Go 语言的接口中有两个非常重要的特性:
- 只要有类实现(模拟)了接口中包含的所有方法,我们就称这个类型实现了这个接口;
- 只要是实现了这个接口的类型,用这个类型定义的变量就可以给这个接口声明的变量赋值。
所以从以上两个特性也可以推出 interface{} 类型的变量,可以接收 任何变量的赋值。这两个特性也被称为鸭子类型,即"走起来像鸭子,叫起来像鸭子(类型模拟了接口中包含的所有方法),那么它就是一只鸭子"。
代码示例:
代码块
- 1
package main
- 2
- 3
import (
- 4
"fmt"
- 5
)
- 6
- 7
var stuInterface interface {
- 8
PrintAge()
- 9
}
- 10
- 11
type Student struct {
- 12
Name string
- 13
Age int
- 14
}
- 15
- 16
func (s Student) PrintAge() {
- 17
fmt.Println(s.Age)
- 18
}
- 19
- 20
func main() {
- 21
stuInterface = Student{
- 22
Name: "Codey",
- 23
Age: 18,
- 24
}
- 25
stuInterface.PrintAge()
- 26
}
- 第 21~24 行:定义了一个自定义类型,并且这个类型实现了接口变量类型中的方法;
- 第 21 行:实例化一个自定义类型的变量,并赋值给这个接口变量;
- 第 25 行:使用接口中的方法。会发现打印了学生的年龄。
执行结果:
3. 自定义接口类型
为了方便使用,一般都会使用自定义类型来定义一个接口类型。同时还可以写一个函数来实例化接口。
代码示例:
代码块
- 1
package main
- 2
- 3
import (
- 4
"fmt"
- 5
)
- 6
- 7
type StudentInterface interface {
- 8
PrintAge()
- 9
}
- 10
- 11
type Student struct {
- 12
Name string
- 13
Age int
- 14
}
- 15
- 16
func (s Student) PrintAge() {
- 17
fmt.Println(s.Age)
- 18
}
- 19
- 20
func newStudent(name string, age int) StudentInterface {
- 21
return Student{Name: name, Age: age}
- 22
}
- 23
func main() {
- 24
stuInterface := newStudent("Codey", 18)
- 25
- 26
stuInterface.PrintAge()
- 27
}
- 第 20~22 行:定义一个函数来实例化接口;
- 第 24 行:初始化一个接口变量。
执行结果:
4. 小结
本文主要介绍了 Go 语言中接口的定义和使用。需要注意以下几点:
- 在 Go 语言中接口是一个类型;
- 一般使用自定义类型来定义接口;
- Go 语言的接口是鸭子类型。
文章来源于网络,侵删!