🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] 接口是一种由程序员来定义的类型,一个接口类型就是一组方法的集合,它规定了需要实现的所有方法。 ## 接口定义 接口的定义格式 ```go type 接口类型名称 interface { 方法名(形参1, ...) (返回值1, ...) ... } ``` >[info] **说明** > - 接口类型名称:Go语言的接口在命名时,一般会在单词后面添加er,如有写操作的接口叫Writer,有关闭操作的接口叫closer等。接口名最好要能突出该接口的类型含义。 > - 方法名:当方法名首字母是大写且这个接口类型名首字母也是大写时,这个方法可以被接口所在的包(package)之外的代码访问。 > - 形参1、返回值1:形参1、返回值1中参数变量名可以省略 ## 实现接口条件 接口就是规定了一个**需要实现的方法列表**,在 Go 语言中一个类型只要实现了接口中规定的所有方法,那么我们就称它实现了这个接口。 ```go // Penson 是人类的结构体 type Penson struct { Name string } // Sing 是 Penson 结构体唱歌的方法 func (p Penson) Sing() { fmt.Printf("%s优美动听的歌声~", p.Name) } // Singer 接口 type Singer interface { Sing() } ``` 上述的案例就是 `Penson` 实现 `Singer` 接口。如果接口定义多个方法的话, `Penson` 也需要定义对应的方法才能实现到 `Singer` 接口 ## 为什么需要使用接口 现在支付方式有微信、支付宝、银行卡等等,每个支付流程都不一样。各自开发一个二维码来收钱。对于客户而言,需要找对应的二维码才能进行支付,这种体验感不算太友好。 如果有一个万能二维码都可以付款的话,对于客户来说,这种体验感比较友好。在 Golang 语言中就是接口。 ## 面向接口编程 编程过程很多时候可以使用到接口的。比如动作属性,很多类型都有这类动作的话,那么就可以实现到接口方式了。例如,支付方式、发声、跑步、睡觉和求面积体积等等 这里举例结账功能。微信、支付宝都有支付功能。这里创建一个结账接口,然后所有付款都可以对接进来结账的。后续有其他付款方式的话,结构体实现到支付的方法即可调用结账的接口来付款。 ```go // WeChat 是微信结构体 type WeChat struct { ID int User string } // Pay 是微信结构体的付款方法 func (w WeChat) Pay(f float64) { fmt.Printf("%s用户微信扣款%.2f元\n", w.User, f) } // Alipay 是支付宝结构体 type Alipay struct { ID int User string } // Pay 是支付宝结构体的付款方法 func (a Alipay) Pay(f float64) { fmt.Printf("%s用户支付宝扣款%.2f元\n", a.User, f) } // Payer 结账接口 type SettleAccounter interface { Pay(float64) } func main() { // 微信结构体赋值给w变量 w := WeChat{1, "jiaxzeng"} // 定义结账类型变量 var s SettleAccounter // 将微信结构体赋值给接口 s = w // 接口调用微信结构体支付的方法 s.Pay(1.248) // 支付宝结账方式 a := Alipay{2, "xiaodunan"} var s2 SettleAccounter = a s2.Pay(1.451) } // 运行结果: // jiaxzeng用户微信扣款1.25元 // xiaodunan用户支付宝扣款1.45元 ``` ## 接口类型变量 那实现了接口又有什么用呢?一个接口类型的变量能够存储所有实现了该接口的类型变量。 ```go // 微信结构体赋值给w变量 w := WeChat{1, "jiaxzeng"} // 定义结账类型变量 var s SettleAccounter // 将微信结构体赋值给接口 s = w // 接口调用微信结构体支付的方法 s.Pay(1.248) // 支付宝结账方式 a := Alipay{2, "xiaodunan"} var s2 SettleAccounter = a s2.Pay(1.451) ``` >[info] 上述举例中 `WeChat` 和 `Alipay` 结构体均实现 `SettleAccounter` 接口,此时一个 `SettleAccounter` 类型的变量就能够接收 `WeChat` 和 `Alipay` 类型的变量。