Golang 接口实现的严格性:方法的字面量和返回值类型必须一致吗?
golang 接口实现的严格性:具体方法必须与接口声明一模一样
在 golang 中,如果某个类型要实现一个接口,那么该类型的实现方法的字面量必须与接口声明的方法的字面量一模一样。
例如,我们定义了产品接口 product 和具体产品 producta:
// product 产品接口 type product interface { getinfo() string } // producta 具体产品a, 实现了product接口 type producta struct { name string } func (p *producta) getinfo() string { return p.name }
同时,我们定义了生产者接口 creator 和具体生产者 creatora:
// Creator 生产者接口 type Creator interface { Produce() Product // 接口方法声明返回值是一个产品接口类型 } // CreatorA 具体生产者A type CreatorA struct {} func (c *CreatorA) Produce() *ProductA { // 这样写CreatorA就没实现接口Creator return &ProductA{"xxx"} }
此时,*producta 是实现了接口 product 的类型。但由于 func(c *creatora) produce() *producta 与接口 creator 的方法声明不一致,因此 creatora 没有实现接口 creator。
只有当 produce 方法的声明方式更改为 func(c *creatora) produce() product 时,creatora 才能实现接口 creator。
由此可见,golang 中对于接口与方法实现的要求十分严格,不仅方法的实现方式要一致,返回值类型也必须一致。即使底层类型实现了相应的接口,也不代表具体方法的实现已经实现了该接口。