使用值接收器的方法既可以通过值调用,也可以通过指针调用。使用指针接收器的方法只能通过指针或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