我一直对 Golang 的 Interface 设计感到疑惑

2017-06-07 14:28:49 +08:00
 changwei

Golang 里面没有 implements 这种关键字来显式的指明某个函数是否实现了某个接口,那么意味着我如果实现函数有和接口不一致的地方,编译器不会提醒我啊。

我觉得像 Java 里面就做得很好,接口实现要用 implements 显示说明,函数重写也有 @override 注解,基本上在编码期间靠 IDE 提示都能找出问题。

难道是我用 Golang 的姿势不对吗?还是 Golang 本身就是这样设计的?

(还有 Golang 接口前面要指定一个 struct,这是为了模拟出一种面向对象的编程风格吗)

2346 次点击
所在节点    问与答
8 条回复
nybux
2017-06-07 15:13:28 +08:00
go 不是面向对象语言,没有继承一说,你只要在类型上实现的方法和 interface 指定的一样就行了。
这种叫“鸭子类型”
https://zh.wikipedia.org/wiki/%E9%B8%AD%E5%AD%90%E7%B1%BB%E5%9E%8B
cloudzhou
2017-06-07 15:16:12 +08:00
使用

var _ Interfacer = (*Implementer)(nil)

的方式进行强约束
jarlyyn
2017-06-07 15:19:18 +08:00
“实现函数有和接口不一致的地方,编译器不会提醒我啊”

在用的地方 会提醒啊。


Golang 接口前面要指定一个 struct

没看懂。

不是 struct 去符合接口么?
pubby
2017-06-07 15:21:06 +08:00
SuperMild
2017-06-07 15:28:29 +08:00
一般代码不会出现接口不一致又能编译通过的情况,如果实在有需要,可以手动写些判断语句。
另外,golang 是不是经典的面向对象,没有 class,但是有很丰富和强大、同时又简单好用的 type。

interface 只指定 method,不指定别的了,你既可以用一个 struct 去实现,也可以用一个 function 去实现,function 也可以有自己的 method,非常好玩。
zhs227
2017-06-07 15:38:44 +08:00
golang 的 interface 是个相当巧妙的设计,可惜了 IDE 变瞎了。
elgoog1970
2017-06-07 17:03:15 +08:00
golang 主要特色:
1. interface
2. channel
3. goroutine
工程项目是少不了这个的。
zhujinliang
2017-06-07 17:18:25 +08:00
写一个 test 就知道能不能实现了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/366648

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX