请问下,像main1这种还算是实现了接口吗【好像完全没有用到接口的定义】?
正常来说的话,像main才算实现了接口
首先,要认识到接口是一个类型,它是为了多态 而生。
其次,要认识到接口实现多态的方式是抽象方法,即定义方法的集合。
最后,要认识到,所谓实现接口,主语是类型,宾语是接口,类型T
实现接口I
。
你的这个例子中,不是main
去实现接口Fruit
(main
是函数不是你定义的类型),而是Apple
这个类型去实现接口Fruit
。
假设别的地方有下面这样一个函数:
func ChiGeTaoTao(f Fruit) string {}
它接受一个Fruit
类型的形参,此时你可以直接将Apple
实例作为实参传入。
为什么?因为你已经将Apple
这个类型实现了Fruit
接口。
这就是接口的多态。
2 回答1.4k 阅读
2 回答1.2k 阅读
2 回答1.2k 阅读
2 回答1.2k 阅读
3 回答796 阅读
2 回答964 阅读
1 回答849 阅读
解释
Go 语言是隐式接口,实现接口的所有方法就实现了接口,而无需在结构体定义中指明:
且 Go 在编译过程中对接口是按需检查的,即你使用接口时,才检查你是否实现了接口(比如声明函数参数、变量赋值时)。
你列出的
main1
中只是一个对结构体的使用,不涉及到接口检查;而main
中将f
的类型定为接口Fruit
,会进行接口检查。结论
Apple
实现了Fruit
接口;main1
中未涉及到对接口的检查,main
中涉及到了对接口的检查。参考资料:4.2 接口 (《Go 语言设计与实现》)