登录
首页 >  Golang >  Go问答

golang接口的问题,某个类型要实现接口, 那类型方法的字面量要与接口声明的方法的字面量一模一样?

来源:SegmentFault

时间:2023-02-16 15:30:37 278浏览 收藏

IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《golang接口的问题,某个类型要实现接口, 那类型方法的字面量要与接口声明的方法的字面量一模一样?》,聊聊go,我们一起来看看吧!

问题内容

比如现在有产品接口(Product)和具体的产品A(ProductA):

// Product 产品接口
type Product interface {
    GetInfo() string
}

// ProductA 具体产品A, 实现了Product接口
type ProductA struct {
    name string
}

func (p *ProductA) GetInfo() string {
    return p.name
}

生产者接口(Creator)和具体生产者A(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) Product() *ProductA
却不符合接口
Creator
?
只有写成
func(c *CreatorA) Product() Product
才符合了接口
Creator
, 那是不是就是说具体方法的声明要跟接口声明写的一毛一样才有效?

正确答案

当然要一样
接口就是一种基本的方法集、数据类型集,不涉及到具体的实现,可以看成是一种预定义。
而你的类型struct,类似我们说的对象,类型(对象)要实现接口,那么必须实现接口里边的方法,与接口里边的方法一致(包括方法的返回值类型一致)我们才能说实现了那个接口。

ProductA---》实现了 接口Product
其中CreatorA想要实现Creator接口,就得实现Creator接口里边的Produce方法;
这个方法必须返回Product接口;
换句话说,想要CreatorA实现Creator接口,在实现这个接口里边的Produce方法的时候,要保持与接口里边这个方法一致,返回值一致,也就是返回Prokuct接口才行

而你定义的这个Produce方法,返回的是ProductA(一个实现了Product接口的对象),不是Product接口,返回值类型不一样(虽然它底层实现了Product接口),也不能说实现了
必须是func(c *CreatorA) Produce() Product

由此可见,golang中接口与方法实现,要求还挺严格的,实现的接口方法返回值必须一致才行,光底层一致不行

到这里,我们也就讲完了《golang接口的问题,某个类型要实现接口, 那类型方法的字面量要与接口声明的方法的字面量一模一样?》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于golang的知识点!

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>