Go 与 泛型: 优点 or 缺陷

2017-02-08 09:26:18 +08:00
 banxi1988

之前看到 Go 中国 的文章: 为什么说 2017 年你必须要学习 Go 了

其中把 Go 语言没有泛型作为其优点之一.

昨天晚上看到新发的文章: Russ Cox 的 2017 年 Go 开发计划

注: Russ Cox 目前是 Go Team 的 leader

其中对于泛型有这么一两句话:

我不相信 Go 团队曾经说过“ Go 不需要泛型”

但我们确实明白,对于 Go 来说缺乏参数多态性是一个显著的障碍。

这样看来, 在 Go 开发团队眼中, Go 没有泛型并不是一个优点啊.

9172 次点击
所在节点    Go 编程语言
128 条回复
htfy96
2017-02-09 12:40:57 +08:00
我只想知道 json 序列化没编译期泛型也不用 go generate 速度怎么上去
bianhua
2017-02-09 12:47:11 +08:00
哈哈哈哈。首先题主的主题是泛型,这帖子已经不知道去哪儿了。最近在写 Golang ,我觉得泛型这种东西,有更好,没有也没什么关系。

@jarlyyn

> 一个东西会比另外一个东西是自然不可能的,东西是客观存在,好与不好是每个人的主管判断,这是一个基本的哲学常识。

不知道我理解错了没。但,你是不是在说,一个东西在客观上是不会比另一个东西好或差的,是这样么?
jarlyyn
2017-02-09 12:49:38 +08:00
@bianhua

是的。

因为好或者坏不是一个客观范畴内的东西。

这个世界本没有好与坏。

只有你认为他好,或者认为他坏。

而不同的人认定好坏的标准是不同的。
Balthild
2017-02-09 12:56:11 +08:00
@noli
> golang 除了写 业务 server 之外,没有想到任何别的场合是能用的。
docker 是虚拟化场合在 Go 上的实现,只要它「能用」即可反驳上述这句话。而你又扯出什么可不可替代的概念来转移话题。
sunsx
2017-02-09 13:03:36 +08:00
@jarlyyn 脾气真好,那个 noli 每回复一次就损你一次,连你媳妇都损上了,居然不发火


当然啦,不关心细节的码农,大概是什么拿到手只要为其所用就好——就像有些人的择偶要求,女的活的,就可以了。
当人只需要满足低级需求的时候,谈什么是好的就是奢侈。
当使用编程语言只需要交货满足工程需要的时候,谈特性都是废话。

你也是这么看的吧?
zgqq
2017-02-09 13:13:18 +08:00
java 恐成最后赢家
janxin
2017-02-09 13:34:11 +08:00
@htfy96 json 解析有方案,但是序列化似乎没有什么好办法...
TangMonk
2017-02-09 13:47:28 +08:00
火气真大
noli
2017-02-09 14:01:15 +08:00
@Balthild 如果你是 docker 的开发者,那么你可以说这句话,然而多数人不是也很少机会用 golang 去扩展 docker 的能力。如果非要说 golang 写了 docker 能证明 golang 不仅仅在业务服务器上能用,那么我也可以说 js 可以写 os ,孤立的例子而已嘛,
jarlyyn
2017-02-09 15:28:04 +08:00
@noli

只要有 os 是 js 写的,为什么你不能说 js 可以写 os?

就如同现在 js 已经可以写应用程序客户端,各平台手机 app 一样。

你自己的话说错了,怎么可以拖 js 下水?
noli
2017-02-09 15:47:59 +08:00
@jarlyyn 所以我没有说过 golang 不能写别的啊,我说的就是场合。
js 写 OS 当然可以,我也没说不可以。
但我不认为 js 能写出有价值的 OS ,因为大家都不觉得 OS 领域是 JS 适合的场合。
同理,我不觉得 golang 能够有更多的地方发挥,因为:

1. 缺乏泛型支持,这也就罢了,居然支持隐式 interface 这种在别的强类型语言里面都可能当作 warning 甚至 error 的特性

2. 缺乏 OS 级别的组件化支持(例如 dll , so 这样的),甚至 golang 自己的包管理也是一坨翔

这两点都是限制一门语言大规模使用的关键缺陷。
小业务用一下,是不错的,但 golang 不会是 better C ,最多跟 python nodejs 竞争一下。
noli
2017-02-09 16:02:29 +08:00
@bianhua

@jarlyyn 认为“一个东西在客观上是不会比另一个东西好或差的” 。如果他说但“东西”指的是客观存在的、非人工事物,那这话很可能是对的。然而世界上至少有两种东西,是客观上会比另外一个东西好或者差的,一是数学,二就是编程语言。这两者都是表达人类思维抽象的工具,这是绝对有好坏之分、先进高级和落后低级之分的。

当然啦,如果有人举例说,“乘法怎么就比加法优秀了” 这样的话,你不用跟他说什么,没学过高等数学的人,说这个话题太为难他们。
thekll
2017-02-09 16:46:13 +08:00
“通用语言”这个概念本身就隐含了“解决各种计算问题的”含义;
“各种计算问题”隐含了“现实中不可能只有一个问题”,即使只有一个问题,那也必须分成多个问题才能解决;
语言的优劣就是相对于某些特定的问题表现出的相对适合性;

撇开问题域去讨论语言的优劣很没意思。很容易陷入一种混乱的攻击,这就像从一个错误的假设可以推出各种匪夷所思的结果,从没有预设的条件去推也会是这种的结果。

最近也在回头看微处理器架构、 ISA 、机器码、汇编语言、算法、编译原理,也仔细想过语言的等价性问题、形式语言、形式系统等。

有感而发,希望自己对于从图灵、冯诺伊曼以来,计算理论模型、计算系统构造者们心中所要实现的那个东西理解的没错。
jarlyyn
2017-02-09 17:08:19 +08:00
@noli

所以这是你觉得,这不是个定论,这是最重要的一个前提。

你觉得 js 不能写 os
你觉得 某个语言可能比别的语言好。

这只是在你觉得的这个范畴之呢的。

“这两点都是限制一门语言大规模使用的关键缺陷。 ”

很多语言本来就不是设计出来用于大规模使用的。

典型如 lua

典型如 php

在我看来,能否被大规模使用的,和语言特性没多大关系。

比如 js 的使用规模够大了吧,是因为语言特性吗?

比如 objectC 算使用规模够大了吧,是因为语言特性吗?

语言被大规模使用的主要语言,很可能是最重要的语言,是适合的场景是不是有了爆发行的增长


至于说什么编程语言是表达人类思维抽象的工具

对不起,对于这个世界绝大部分的人来说,编程语言只是解决问题的工具。

我想不通我的思维,哪怕抽象后,能如何被任何一门编程语言哪怕表达一部分。
noli
2017-02-09 17:29:18 +08:00
@thekll 但其实你有没有想过,现代软件工程面对的“问题领域”其实本身很多是生安白造的概念,为了推广一些商业解决方案特意把水搞浑的。如果基于这类“领域问题”来讨论编程语言的优劣,本身就是在虚弱的理论基础上来谈的。

我举个例子(读音:再黑 golang 一把)。 golang 标榜的是解决什么问题呢,以下内容摘自( https://golang.org/doc/faq#What_is_the_purpose_of_the_projecthttps://talks.golang.org/2012/splash.article

1. 解决类似于 C/C++ 这样的语言大规模编译时编译慢的问题
从观察来看 golang 是编译得够快的,然而 golang 能不能像 C/C++ 那样组织大规模的项目,我上一条回复说了, golang 里面的一些固有缺点本身阻碍了 golang 项目的可组织性。下文详解。并且, C/C++ 大项目慢,本身固然有 C/C++ 的头文件机制的原因,但是很多其他语言编译得很快,却不必需要像 golang 那样为了编译快对语言特性做阉割。甚至,即使以 C/C++ 的头文件、源代码分离的方式组织代码,并不一定就会导致编译慢。 只不过重新写一个 C++ 的编译器实在是太难了,没有必要。(同理,重新写一个 docker 也没有必要,这并不意味着用 golang 写 docker 就是好, 对 @CRVV 蜜汁微笑 )

2. 对软件模块的依赖的分析更容易,解决 模块正确集成的问题
哈哈, golang 自己很明显就做不到。对比同为编译到二进制代码的 mono 和 .NET CLR 是怎么解决模块版本差异的, NuGet 是怎么设计的,我喷 golang 的模块机制就是一坨屎真心不过分。

3. golang 提供 GC 和并发任务之间的通讯的基本支持。
golang 的 GC 有进步,那我就祝贺它不喷它了,反正你喷了也没有,你又不能影响或者 hack golang 的 GC 。 channel 就是所说的对并发任务间的通讯的基本支持了吧?这从来就不是什么难题,各大语言都有类似的解决方案,而且还不止满足一种模型,当然啦,有很多人驾驭不了,找到 golang 就觉得有救星了。然而这种狂热仅仅是出于无知和无能的自信。

4. By its design, Go proposes an approach for the construction of system software on multicore machines.

这个 propose 是成功的。然而很遗憾的是,也导致了一堆人只懂得这种方案。我想说,解决异步回调地狱的解决方案有很多种,通过 event queue 机制只是其中的一种;其他的方式包括:语言生成状态机( async await ); Actor 模型;

event queue 也是有缺点的,比起状态机方法,基于 event queue 异步事件的上下文依然存在事件处理内外机制的割裂问题,代码耦合性属于中等。然而 golang 在语言级别支持的 channel 很大程度阻止你们使用其他模型。
chingli
2017-02-09 17:29:24 +08:00
@noli 1. 说说 Go 的接口实现有什么不好?

2. Go 的包管理确实还不完善,但也有可取之处,不至于说成一坨翔。
jarlyyn
2017-02-09 17:34:45 +08:00
@chingli

因为接口不是面向对象

你很难让一个面向对象粉去喜欢接口的。
noli
2017-02-09 17:44:27 +08:00
@jarlyyn 喷你一点爽快感都没有,因为你自认为不需要讨论更高层次的东西,我咋秀优越感呢。你自个儿玩得开心就好。我只对你吹的 golang 感兴趣,因为 golang 真的很适合用来暴露智商,哈哈哈哈。

@chingli golang 的包管理做不到模块版本差异分析——就这一点说明了其实它根本没有解决过(甚至可能其发明者故意歪曲了这个问题的本质),它只是拿这个来作为噱头。 golang 的 interface 设计本身就是造成这个“已经解决的问题”变得更麻烦的原因之一。

golang interface 本意是一个 运行时安全的 duck typing ,然而又允许空 interface ,这样就把所有的 泛型可能性、多分派的可能性完全扼杀,甚至引入了漏洞(而在大规模项目里面,万能指针就是 万恶根源)

这种设计让我看到了 golang 设计者其实并没有解决问题的诚意,只是用歪打正着的方式来回避问题。所以我特别讨厌 golang 以及 golang 吹;要么是出于无知,要么是出于无耻。
jarlyyn
2017-02-09 17:49:26 +08:00
@noli

说的编程语言是个层次很高的东西一样,呵呵。要秀优越很简单啊,穷车富表么,秀一下让人羡慕的生活是最好的秀优越感的吗。

我到现在也不明白,难道会或者擅长几种语言也是一个能秀优越的地方吗?你的人生不可能这么缺乏亮点吧?
noli
2017-02-09 17:58:25 +08:00
gopher 是怎么也理解不了 return Either<Result, Error> 这种方式 比 return res, err 好在哪的啦,你很难让一条喜欢钻狗洞的狗,人模人样的走大门。

什么?这是面向对象? @jarlyyn 你说是面向对象吗?

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

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

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

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

© 2021 V2EX