Uber Go 语言编程规范:接收器(receiver)与接口

使用值接收器的方法既可以通过值调用,也可以通过指针调用。使用指针接收器的方法只能通过指针或addressable values调用

例如:

type S struct {
  data string
}

//值接收器
func (s S) Read() string {
  return s.data
}
//指针接收器
func (s *S) Write(str string) {
  s.data = str
}

//定义一个map,value为S{1: {"A"}
sVals := map[int]S{1: {"A"}}

// 只能通过值调用Read()
sVals[1].Read()

// 无法编译,因为Write方法为指针接收器
//  sVals[1].Write("test")

//定义一个map,value 为S{1: {"A"}}
sPtrs := map[int]*S{1: {"A"}}

// 你可以用指针同时调用方法Read()和Write() 
sPtrs[1].Read()
sPtrs[1].Write("test")

同样,即使方法拥有值接收器,那么可以通过指针来满足接口(主要指实现接口方法的接收器)。

//定义一个接口
type F interface {
  f()
}

type S1 struct{}

//结构体S1实现接口F,接收器为值接收器
func (s S1) f() {}

type S2 struct{}

//结构体S2实现接口F,接收器为指针接收器
func (s *S2) f() {}

s1Val := S1{} //s1值
s1Ptr := &S1{} //s1指针
s2Val := S2{} //s2值
s2Ptr := &S2{} //s2指针

var i F //定义接口类型变量
i = s1Val //值类型赋值成功
i = s1Ptr //指针类型赋值成功
i = s2Ptr //指针类型赋值成功


//编译失败,因为s2Val是一个值,而且S2实现的接口方法f()接收器是指针,非值接收器
//   i = s2Val

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DreamCatcher

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值