浅谈Go 接口的基本使用

114 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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

如果本文对你有帮助,欢迎点赞收藏加关注,如果本文有错误的地方,欢迎指出!