Go中接口绑定值接收者方法时为何可返回结构体指针实现接口?
你的原有想法是错误的,Go语言的方法集规则允许返回结构体指针,不需要将draw()改为指针接收者实现。
核心原因:Go语言的方法集自动适配规则
Go在判断类型是否实现接口时,遵循以下方法集规则:
- 对于自定义类型
T,它的方法集包含所有接收者为T的方法 - 对于指针类型
*T,它的方法集同时包含接收者为T和*T的所有方法
你当前的代码中,Rectangle等结构体都实现了值接收者的draw()方法,那么对应的指针类型*Rectangle、*Square、*Circle自然也满足Shape接口的要求,因此CreateShape方法直接返回结构体指针是完全合法的。
补充反向场景说明
如果你将draw()改为指针接收者实现,那么只有对应结构体的指针类型才满足Shape接口,结构体值类型不再满足接口要求,此时CreateShape方法只能返回结构体指针,不能返回结构体值。
额外注意
你贴出的代码中存在一处拼写错误:Square类型的draw方法接收者写成了Squre,会导致编译不通过,实际使用时需要修正。
内容的提问来源于stack exchange,提问作者s666
相关产品推荐
相关产品推荐

