Golang Go语言中到处都是 interface 的代码该怎么阅读

同事写的一个比较大的功能里面,到处定义的 interface, 平均实现一个 interface 的类方法至少 3 个,大段大段的 if 多层嵌套,看得想自杀。
Golang Go语言中到处都是 interface 的代码该怎么阅读

32 回复

if 是在转类型么?试试 case ?(虽然也好不到哪里去。。。

更多关于Golang Go语言中到处都是 interface 的代码该怎么阅读的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


if 嵌套是另外一个恶心的问题, 主要是他调一个 interface 方法有特么至少 3 个结构实现了这个方法, 我得一个一个看, 每个方法都特么乱七八糟 哎醉了

如果是不带 else 的 if 嵌套,是可以换种写法拉平的。

三种以上具体实现的 interface 不是标准玩法么,要是只有一种实现,去用 interface 那才是恶心。你需要的是对代码的熟悉以及一个高度集成的 IDE

这个有点恶心, 把 golang 写得和动态语言一样, 后面根本不好维护


我怎么觉得你说反了,虽说不看代码不好说,我第一反应是这人把 golang 写得和 java 一样……

不会吧 java 很少这么写代码的

golang 这个语言 如果 java 都写不好的人真的不要碰。


我的意思是 java 特别喜欢过度追求设计模式,别的语言里我感觉是没那么严重。
到 golang 里很多不需要靠设计模式就能完成的逻辑,如果过度追求设计模式,就会写成大量 interface 的过度包装形式了。

一个 interface 没有多个实现,那还要这个 interface 做什么??

interface 不是本来就是用来抽象然后多实现的吗?

这样子很难维护~~
你同事在坑你们项目组了。

就不能封装下吗?至少 alias 一下。。

goland 可以分析

interface 不就是做这种抽象的嘛?不是很清楚,可能是 Java 程序员 XD

我用 interface 有时候只是为了把不通层的代码分开,不一定有多个实现。我是觉得这样更好读一些。比如 rpc 层只处理 rpc 本身的逻辑,至于数据具体的存取,就放在数据层实现,rpc 层定义自己需要的存取 interface,数据层实现。不一定一个 interface 就一定要有多个实现吧。

静态语言一切都在源代码里定义清楚了,这个 interface 的具体实现是什么,在前面肯定有声明的,很容易搞清楚,另外用好的 IDE 也能帮你自动分析。

还可以善用 godoc,生成 html 文件看,结构非常清晰。

其实问题是项目本身复杂,用了 interface 已经算好的了,不用的话更难看

明显用错了

比如 io.Reader 就只实现 Reader 的功能,不要再看各个 type 自己的实现才是 interface 的正确用法

能用就行了,至于代码、风格、神马之类的,当没有看到就好了。

golang 实现一个 interface 是 implicit 的,不需要声明实现,只要你实现了那几个函数就可以作为 interface 到处传,其实跟动态语言没啥区别,只是用鸭子类型的时候要先说好这个鸭子能干啥。

用 interface,if 都没毛病。看不到代码我们能说啥

隐形实现并不影响分析,要当作 interface 用的时候还是必须先声明这个变量是个 interface 并且其具体实现是什么。

例如 var i InterfaceFoo = TypeBar{“hello”} 就说明 i 是一个 interface,其具体实现是 TypeBar。

看不懂楼主在烦恼什么,鸭子类型就是这个样子,就拿 c++ 的模板来讲

template <typename T>
void doSomething(T& t)
{
t.doFoo();
}

你在这里不借助 IDE 也不好说传进来的 t 到底是个什么类型,因为只要实现了 doFoo 函数接口
这里的调用就没有问题(类比于 golang 的 interface )

golang 的 interface 看起来确实很累,因为隐式实现, 尤其当 interface 的方法比较多的

到处都是 template 的 c++代码怎么阅读
到处都是 interface 的 java 代码怎么阅读。。。。

java 特别喜欢过度追求设计模式
====
这是写代码的人而不是 java

ls +1, 辣鸡写什么都是辣鸡

啥需求会到处写 interface ?我认为都是在滥用了。。
写过一年 go,用到 interface 的地方屈指可数。

就是不熟悉代码,所以看完一个方法的三种实现特别费神,边看边猜到底在实现什么。

我用的就是 goland, 请问咋分析, 这种实现 interface 的方法每次想看一跳转就跳到 interface 上面去啥都看不了。我现在要看都是 ctrl+f 全文搜哪些地方在实现这个方法,每个地方实现都要看一下。 想死

#27 高版本 goland interface 上有箭头可以列出所有实现。和 java 差不多

因为 go 是隐式实现啊, 根本不知道这个地方的方法具体实现是在哪里,需要一个一个实现看。

interface 方便写代码,却实不方便读代码

>>>我用的就是 goland, 请问咋分析, 这种实现 interface 的方法每次想看一跳转就跳到 interface 上面去啥都看不了。>>>我现在要看都是 ctrl+f 全文搜哪些地方在实现这个方法,每个地方实现都要看一下。 想死

更新一下 goland, interface{}左边有绿色按钮点击可以列出有哪些 struct 实现了这个 interface

在Go语言中,interface的广泛使用确实可能会让初学者在阅读代码时感到困惑。但理解并掌握interface的阅读方法,对于深入理解Go语言的并发模型和抽象设计至关重要。

首先,要认识到interface在Go中主要扮演着定义行为契约的角色。它规定了实现该接口的类型必须提供的方法集。当你看到一个函数接受一个interface类型的参数时,这意味着这个函数可以与任何实现了该接口的类型协同工作。

阅读interface代码时,可以从以下几个方面入手:

  1. 查找接口定义:首先找到interface的定义,明确它规定了哪些方法。这通常位于代码的顶部或者专门的接口文件中。

  2. 识别实现类型:接着,查找实现了该接口的具体类型。这通常通过查看类型的方法集来完成,确认它们是否满足接口的要求。

  3. 理解调用关系:理解函数或方法是如何通过interface与具体类型进行交互的。这有助于你把握代码的整体流程和逻辑。

  4. 利用IDE工具:现代IDE(如GoLand、VSCode等)提供了强大的代码导航和重构功能,可以帮助你快速定位接口及其实现,提高阅读效率。

  5. 实践与学习:通过编写自己的代码来实践interface的使用,结合阅读开源项目中的代码,逐步加深对Go语言interface机制的理解。

总之,阅读Go语言中的interface代码需要耐心和细心,通过不断实践和学习,你将逐渐掌握这一强大的抽象工具。

回到顶部