请问一下,关于go中接口的这样也算实现接口吗?

image.png
请问下,像main1这种还算是实现了接口吗【好像完全没有用到接口的定义】?
正常来说的话,像main才算实现了接口
image.png

阅读 1.7k
2 个回答

解释

Go 语言是隐式接口,实现接口的所有方法就实现了接口,而无需在结构体定义中指明:

// 无需类似这样显式声明实现 Fruit 接口(以下非合法语法)
type Apple struct implements Fruit {
    name string
}

且 Go 在编译过程中对接口是按需检查的,即你使用接口时,才检查你是否实现了接口(比如声明函数参数、变量赋值时)。

你列出的 main1 中只是一个对结构体的使用,不涉及到接口检查;而 main 中将 f 的类型定为接口 Fruit ,会进行接口检查。

结论

  1. 结构体 Apple 实现了 Fruit 接口;
  2. main1 中未涉及到对接口的检查,main 中涉及到了对接口的检查。

参考资料:4.2 接口 (《Go 语言设计与实现》)

先掌握理论

首先,要认识到接口是一个类型,它是为了多态 而生。

其次,要认识到接口实现多态的方式是抽象方法,即定义方法的集合

最后,要认识到,所谓实现接口,主语是类型,宾语是接口类型T实现接口I

再动手实践

你的这个例子中,不是main去实现接口Fruitmain是函数不是你定义的类型),而是Apple这个类型去实现接口Fruit

假设别的地方有下面这样一个函数:

func ChiGeTaoTao(f Fruit) string {}

它接受一个Fruit类型的形参,此时你可以直接将Apple实例作为实参传入。

为什么?因为你已经将Apple这个类型实现了Fruit接口。

这就是接口的多态。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题