开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 15天,点击查看活动详情
本文主要介绍Go的接口类型的基本使用,快速上车
定义
接口(interface),是一种抽象类型。相较于基本数据类型注重的“我是谁”,接口类型更注重“我能做什么”。接口类型就像是一种约定,概括了一种类型应该具备哪些方法,能提供什么能力。
定义格式:
type 接口类型名 interface{
方法名1( 参数列表1 ) 返回值列表1
方法名2( 参数列表2 ) 返回值列表2
…
}
其中,参数列表和返回值列表,非必填
//示例:
type IPayer interface {
CheckOut(float64)
}
使用案例
使用接口的方式,实现支付宝、微信,不同支付渠道处理逻辑的解耦
type IPayer interface {
CheckOut(float64)
}
//支付宝
type AliPay struct {
Name string
}
func (a AliPay) CheckOut(amount float64) {
fmt.Println(fmt.Sprintf("向支付宝商家%s支付%v元", a.Name, amount))
}
//微信支付
//var _ IPayer = &WxPay{} //约束必须实现接口的所有方法
//var _ IPayer = (*WxPay)(nil)
type WxPay struct {
Name string
}
func (a WxPay) CheckOut(amount float64) {
fmt.Println(fmt.Sprintf("向微信商家%s支付%v元", a.Name, amount))
}
//实例化支付对象
func NewPayer(payMode string, name string) IPayer {
var payer IPayer
switch payMode {
case "alipay":
payer = AliPay{Name: name}
case "wxpay":
payer = WxPay{Name: name}
default:
panic("payMode error")
}
return payer
}
func main() {
//写法1
var pay IPayer
//pay.CheckOut(100) //panic: runtime error: invalid memory address or nil pointer dereference
pay = AliPay{Name: "海底捞"}
pay.CheckOut(100)
pay = WxPay{Name: "海底捞"}
pay.CheckOut(200)
//写法2
payer := NewPayer("alipay", "海底捞")
payer.CheckOut(220)
payer2 := NewPayer("wxpay", "海底捞")
payer2.CheckOut(320)
}
接口值
由于接口类型的值可以是任意一个实现了该接口的类型值,所以接口值除了需要记录具体值之外,还需要记录这个值属于的类型。也就是说接口值由“类型”和“值”组成
一个接口只有 Type == nil
并且 Value == nil
,该接口才等于 nil
如果本文对你有帮助,欢迎点赞收藏加关注,如果本文有错误的地方,欢迎指出!