Golang 接口 (interface) 用法介绍

时间:2024-10-10 13:40:40

Golang interface 用法

作者:闪电豹猫 转载注明出处

1. 接口 (interface) 介绍

接口是 Go 语言提供的数据类型之一,它把所有具有共性的方法 (注意与函数区别开) 定义在一起,任何其它类型只要一一实现这些方法的话,我们就称这个类型实现了这个接口。Go 语言的接口与 C++ 的虚函数有共通之处,提高了语言的灵活性的同时也弥补了语言自身的一些不足。

Go 语言的接口与其它面向对象语言的接口不同,Go 的接口只是用来对方法进行一个收束,而正是这个收束,使得 Go 这个面向过程的语言拥有了面向对象的特征。

一般来说,Go 接口的主要功能有:

  1. 作为方法的收束器,进行具有 “面向对象程序设计特色” 的程序设计。
  2. 作为各种数据的承载者,可以用来为函数接收各类不同数量的函数参数,这也是 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 {}