一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情。
Go学习打卡Day06 接口
接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节。在Go语言中接口(interface)是一种类型,一种抽象的类型。接口类型就像是一种约定——概括了一种类型应该具备哪些方法,在Go语言中提倡使用面向接口的编程方式实现解耦。
- 接口是一种由程序员来定义的类型。
- 一个接口类型就是一组方法的集合。
- 规定了需要实现的所有方法。
1、接口的定义
每个接口类型由任意个方法签名组成,接口的定义格式如下:
type 接口类型名 interface{
方法名1( 参数列表1 ) 返回值列表1
方法名2( 参数列表2 ) 返回值列表2
…
}
- 接口类型名:Go语言的接口在命名时,一般会在单词后面添加
er,如有写操作的接口叫Writer,有关闭操作的接口叫closer等。接口名最好要能突出该接口的类型含义。 - 方法名:当方法名首字母是大写且这个接口类型名首字母也是大写时,这个方法可以被接口所在的包(package)之外的代码访问。
- 参数列表、返回值列表:参数列表和返回值列表中的参数变量名可以省略。
定义一个包含Sing()方法的Singer接口。
type Singer interface{
Sing([]string) int
}
接口就是规定了一个需要实现的方法列表,在 Go 语言中一个类型只要实现了接口中规定的所有方法,那么我们就称它实现了这个接口。
package main
import "fmt"
type Singer interface {
Sing()
}
type Person struct{}
func (p Person) Sing() {
fmt.Println("Sing song~")
}
type Cat struct{}
func (c Cat) Sing() {
fmt.Println("Miao miao~")
}
func main() {
p := Person{}
c := Cat{}
p.Sing()
c.Sing()
}
/*
Sing song~
Miao miao~
*/
在电商系统中我们允许用户使用多种支付方式(支付宝支付、微信支付、银联支付等),我们的交易流程中可能不太在乎用户究竟使用什么支付方式,只要它能提供一个实现支付功能的Pay方法让调用方调用就可以了。
再比如我们需要在某个程序中添加一个将某些指标数据向外输出的功能,根据不同的需求可能要将数据输出到终端、写入到文件或者通过网络连接发送出去。在这个场景下我们可以不关注最终输出的目的地是什么,只需要它能提供一个Write方法让我们把内容写入就可以了。
Go语言中为了解决类似上面的问题引入了接口的概念,接口类型区别于我们之前章节中介绍的那些具体类型,让我们专注于该类型提供的方法,而不是类型本身。使用接口类型通常能够让我们写出更加通用和灵活的代码。
package main
import "fmt"
type Payer interface {
Pay(float64)
}
type ZhiFuBao struct {
}
func (z *ZhiFuBao) Pay(amount float64) {
fmt.Printf("支付宝付款: %.2f元\n", amount)
}
type WeChat struct {
}
func (w *WeChat) Pay(amount float64) {
fmt.Printf("微信付款: %.2f元\n", amount)
}
func Deal(obj Payer) {
obj.Pay(2000)
}
func main() {
Deal(&ZhiFuBao{})
Deal(&WeChat{})
}
/*
支付宝付款: 2000.00元
微信付款: 2000.00元
*/
接口类型是Go语言提供的一种工具,在实际的编码过程中是否使用它由你自己决定,但是通常使用接口类型可以使代码更清晰易读。