Golang interface 用法
作者:闪电豹猫 转载注明出处
1. 接口 (interface) 介绍
接口是 Go 语言提供的数据类型之一,它把所有具有共性的方法 (注意与函数区别开) 定义在一起,任何其它类型只要一一实现这些方法的话,我们就称这个类型实现了这个接口。Go 语言的接口与 C++ 的虚函数有共通之处,提高了语言的灵活性的同时也弥补了语言自身的一些不足。
Go 语言的接口与其它面向对象语言的接口不同,Go 的接口只是用来对方法进行一个收束,而正是这个收束,使得 Go 这个面向过程的语言拥有了面向对象的特征。
一般来说,Go 接口的主要功能有:
- 作为方法的收束器,进行具有 “面向对象程序设计特色” 的程序设计。
- 作为各种数据的承载者,可以用来为函数接收各类不同数量的函数参数,这也是 Go 提倡的接口编程。
2. 接口的定义和使用
2.1 定义
比如一个完整方法的接口的定义:
// 这是接口,接口内只有方法的定义,没有具体实现
type 接口类型名 interface {
方法名1( 参数列表1 ) 返回值列表1
方法名2( 参数列表2 ) 返回值列表2
...
}
// 定义结构体
type 结构体名 struct {
变量名1 类型1
变量名2 类型2
...
}
// 实现接口方法
func ( 结构体变量1 结构体名 ) 方法名1( 参数列表1 ) 返回值列表1 {
//方法实现
}
func ( 结构体变量2 结构体名 ) 方法名2( 参数列表2 ) 返回值列表2 {
//方法实现
}
func ( 结构体变量n 结构体名 ) 方法名n( 参数列表n ) 返回值列表n {
//方法实现
}
在实践中,我们一般将接口命名为 “什么什么er”,比如写操作的接口可以叫Writer
,读取字符串的接口可以叫做StringReader
。和变量的命名规则一样,接口名的命名也是不能以数字开头、只允许出现一种特殊字符_
,开头大写则包外可见,开头小写则方法在包外不可见等等。
对于接口内的方法名,也是一样的。只有接口名和方法名的首字母都大写,才可以在包外调用这个接口的这个方法。
2.2 使用
一个接口只要全部实现了接口中声明的方法,那么就是实现了这个接口。换句话讲,接口就是一个需要具体实现的方法的列表。
下面给出一个示例代码
// 定义接口
type Canteen interface {
MakeRice()
MakeNoodles()
}
// 定义结构体
type ZhuYuan struct {}
type HaiTang struct {}
type DingXiang struct {}