1
nomoon 2017-10-24 01:58:55 +08:00
if 是在转类型么?试试 case ?(虽然也好不到哪里去。。。
|
2
johnsneakers OP @nomoon if 嵌套是另外一个恶心的问题, 主要是他调一个 interface 方法有特么至少 3 个结构实现了这个方法, 我得一个一个看, 每个方法都特么乱七八糟 哎醉了
|
3
wweir 2017-10-24 07:44:26 +08:00 via Android
如果是不带 else 的 if 嵌套,是可以换种写法拉平的。
三种以上具体实现的 interface 不是标准玩法么,要是只有一种实现,去用 interface 那才是恶心。你需要的是对代码的熟悉以及一个高度集成的 IDE |
4
zjsxwc 2017-10-24 08:38:52 +08:00
这个有点恶心, 把 golang 写得和动态语言一样, 后面根本不好维护
|
7
nekoyaki 2017-10-24 09:26:14 +08:00
@mikulch
我的意思是 java 特别喜欢过度追求设计模式,别的语言里我感觉是没那么严重。 到 golang 里很多不需要靠设计模式就能完成的逻辑,如果过度追求设计模式,就会写成大量 interface 的过度包装形式了。 |
8
ZSeptember 2017-10-24 09:33:03 +08:00
一个 interface 没有多个实现,那还要这个 interface 做什么??
|
9
yongzhong 2017-10-24 09:39:26 +08:00
interface 不是本来就是用来抽象然后多实现的吗?
|
10
cabing 2017-10-24 09:52:17 +08:00
这样子很难维护~~
你同事在坑你们项目组了。 就不能封装下吗?至少 alias 一下。。 |
11
zts1993 2017-10-24 10:05:31 +08:00
goland 可以分析
|
12
janxin 2017-10-24 10:14:17 +08:00
interface 不就是做这种抽象的嘛?不是很清楚,可能是 Java 程序员 XD
|
13
HarrisonZ 2017-10-24 10:25:59 +08:00
我用 interface 有时候只是为了把不通层的代码分开,不一定有多个实现。我是觉得这样更好读一些。比如 rpc 层只处理 rpc 本身的逻辑,至于数据具体的存取,就放在数据层实现,rpc 层定义自己需要的存取 interface,数据层实现。不一定一个 interface 就一定要有多个实现吧。
|
14
SuperMild 2017-10-24 10:26:30 +08:00
静态语言一切都在源代码里定义清楚了,这个 interface 的具体实现是什么,在前面肯定有声明的,很容易搞清楚,另外用好的 IDE 也能帮你自动分析。
还可以善用 godoc,生成 html 文件看,结构非常清晰。 |
15
SuperMild 2017-10-24 10:28:41 +08:00
其实问题是项目本身复杂,用了 interface 已经算好的了,不用的话更难看
|
16
mengzhuo 2017-10-24 10:30:10 +08:00 1
明显用错了
比如 io.Reader 就只实现 Reader 的功能,不要再看各个 type 自己的实现才是 interface 的正确用法 |
17
jameshuazhou 2017-10-24 10:49:49 +08:00
能用就行了,至于代码、风格、神马之类的,当没有看到就好了。
|
18
hjc4869 2017-10-24 10:51:17 +08:00
@SuperMild golang 实现一个 interface 是 implicit 的,不需要声明实现,只要你实现了那几个函数就可以作为 interface 到处传,其实跟动态语言没啥区别,只是用鸭子类型的时候要先说好这个鸭子能干啥。
|
19
pubby 2017-10-24 10:59:17 +08:00 via Android
用 interface,if 都没毛病。看不到代码我们能说啥
|
20
SuperMild 2017-10-24 11:11:37 +08:00
@hjc4869 隐形实现并不影响分析,要当作 interface 用的时候还是必须先声明这个变量是个 interface 并且其具体实现是什么。
例如 var i InterfaceFoo = TypeBar{"hello"} 就说明 i 是一个 interface,其具体实现是 TypeBar。 |
21
araraloren 2017-10-24 11:53:41 +08:00
看不懂楼主在烦恼什么,鸭子类型就是这个样子,就拿 c++ 的模板来讲
template <typename T> void doSomething(T& t) { t.doFoo(); } 你在这里不借助 IDE 也不好说传进来的 t 到底是个什么类型,因为只要实现了 doFoo 函数接口 这里的调用就没有问题(类比于 golang 的 interface ) |
22
lixm 2017-10-24 13:53:49 +08:00
golang 的 interface 看起来确实很累,因为隐式实现, 尤其当 interface 的方法比较多的
|
23
GeruzoniAnsasu 2017-10-24 13:57:05 +08:00
到处都是 template 的 c++代码怎么阅读
到处都是 interface 的 java 代码怎么阅读。。。。 |
25
BBCCBB 2017-10-24 14:09:55 +08:00
ls +1, 辣鸡写什么都是辣鸡
|
26
ChristopherWu 2017-10-24 14:26:18 +08:00
啥需求会到处写 interface ?我认为都是在滥用了。。
写过一年 go,用到 interface 的地方屈指可数。 |
27
johnsneakers OP |
28
zts1993 2017-10-24 14:39:56 +08:00 1
@johnsneakers #27 高版本 goland interface 上有箭头可以列出所有实现。和 java 差不多
|
29
johnsneakers OP @araraloren 因为 go 是隐式实现啊, 根本不知道这个地方的方法具体实现是在哪里,需要一个一个实现看。
|
30
myself659410 2017-10-25 09:15:31 +08:00
interface 方便写代码,却实不方便读代码
|
31
freestyle 2017-10-29 23:50:12 +08:00
>>>我用的就是 goland, 请问咋分析, 这种实现 interface 的方法每次想看一跳转就跳到 interface 上面去啥都看不了。>>>我现在要看都是 ctrl+f 全文搜哪些地方在实现这个方法,每个地方实现都要看一下。 想死
@johnsneakers 更新一下 goland, interface{}左边有绿色按钮点击可以列出有哪些 struct 实现了这个 interface |