type Itest interface {
SayHello()
}
var G_Test Itest
type TestS struct {
id_ int
}
func (ts TestS)SayHello() {
ts.id_ = 1
}
type TestP struct {
id_ int
}
func (tp *TestP)SayHello() {
tp.id_ = 1
}
func main() {
G_Test = TestS{} //OK
G_Test = &TestS{} //OK
G_Test = TestP{} //compile error:cannot use TestP literal (type TestP) as type Itest in assignment:
//TestP does not implement Itest (SayHello method has pointer receiver)
G_Test = &TestP{} //OK
}
代码如上,TestS 和 TestP 都实现了接口 Itest,TestS 方法接收者是本身, TestP 方法接收者是其指针,然后为什么会报这种错误?
为什么当接收者不是指针的时候可以结构体本身和指针都能赋值给接口,而接收者是指针的时候就不行?
是否和隐式转换有关?
观察很多源码包(如bytes.Buffer,bytes.NewBuffer()返回的指针)都是写成接收者是指针,然后New结构体的方法返回的是指针。这样写的好处是什么?还是说是约定俗成?
有疑问加站长微信联系(非本文作者)