知乎热议:认为 Go 是用过的最丑的编程语言。。。

Go语言精选

共 2732字,需浏览 6分钟

 · 2022-01-19

点击上方蓝色“Go语言中文网”关注,每天一起学 Go

大家好,我是站长 polarisxu。

在知乎上看到一个被浏览了 164 万的问题:《你用过最丑的编程语言是哪个?》,地址:https://www.zhihu.com/question/448169628。

目前一共有 247 个回答,对其中说 Go 是最丑的编程语言仔细看了下。

吐槽 Go 语言,错误处理难免被吐槽:

但其他的一些所谓的丑的原因,更多是先入为主:跟之前掌握的语言不一致,就认为是丑?当然我这里不做过多评论,毕竟萝卜青菜各有所爱!觉得丑不用即可,没有十全十美的语言,自己喜欢就好。

以下是一些认为 Go 丑的回复。


凑个go的七宗罪吧:

  1. map设计的非常难用。为什么map的key加了[], value却不加,极其丑陋的语法设计; map每次查key在不在的时候,非要写个if 检查,人家java scala python 半行都用不到; 非要把map和set混在一起,然而实际项目用的时候,一般大家还是会再实现一个set,何苦呢
  2. 臭名昭著的if err != nil
  3. 标准库的东西像defer, channel,非要内置,夸go的时候,有人就会说你看go多有特色
  4. 不支持override父类方法,每次写test的时候,要么写个和test共享公共的函数,要么将函数作为参数传到方法里来,导致代码可读性降低,同时增加写test难度,写go test真是折磨
  5. 不支持泛型,虽然后面版本在加了
  6. strings的设计也是很怪异,非要单独搞个库,每次string都要单独传到strings库里,导致代码变长,说好的至简呢
  7. 不支持三目运算

但是另一方面,go的语法整体而言上手难度很低,从公司角度说,大大降低了上手成本,刚入职的新人学几个月和写了2,3年的人差别不会太大,这实际上是将每个人去差异化,提高了可替代性,对公司而言是好事。对个人嘛,就见仁见智了,反正大多数程序员不是只会一门语言的

作者:dlwlrma 链接:https://www.zhihu.com/question/448169628/answer/2255874749


必须是golang。

本来应该通过标准库提供的特性,偏要硬塞进语法里:defer、channel

屎一样的异常处理规范,每个调用都拖一个err

变量声明偏要搞个:=和var两种,既然var适用范围完全包含:=那加这个是为了什么?就图写编译器时候方便点?

没有三目,明明一个简单的true/false判断要拖拖累累的写一大串。本来简简单单一个初始化结构体里面一个字段需要一个true/false判断,就因为没有三目,要分两段写

没有强制的New函数,想保证初始化安全就必须要么每个公开函数都检查一遍初始化,要么每个公开结构体都换成接口,再加一个New函数,公开函数的内部还得做一次强转

类型系统就像个笑话,连搞个集合类型都要强转,改个接口只能靠编译错误来给实现类型添加函数

到处都是复制粘贴的代码,代码生成器居然还成了标配

goroutine连线程都不能明确绑定,本来一个eventloop一个锁都不用加,到go这锁满天飞。纯依靠channel写就是个笑话。没go的时候就有阻塞队列,为什么阻塞队列用得少不动脑子想想

更无语的是,go吹整天就只会“大道至简”,“我们go不需要这种功能”,21世纪的新语言连个泛型都不支持还有脸出来吹语言特性,整天吊打这吊打那

经典踩一捧一,拿hello world跟别的语言完整的产品比二进制大小,怎么不引个istio pilot或者k8s api再比呢?

就这还好意思扯打容器镜像,别人用java的打镜像时候,jdk是共用的一层,甚至半年都不改一次的classpath都是固定死的一层,发布时候需要push的就只有自己写的代码,go拖拖赖赖一大坨几百兆也有脸吹打容器镜像?

go的缺点就摆在那,优点也摆在那,但凡写过几万行go也不至于不懂。

说白了恶心的不是go,是go吹。简直是编程语言界的废虾

作者:wkGCaSS 链接:https://www.zhihu.com/question/448169628/answer/1954799027


golang。

golang的类型设计有根本缺陷:nil。golang不使用nil就无法表示optional,使用nil就意味着使用指针和interface{},不仅不方便而且陷入到java曾经遇到的NullPointerException陷阱。这种错误的设计直接导致了golang做序列化和反序列化时表现非常糟糕:比如你无法区分一个bool类型的成员在反序列化之前究竟是不存在,还是是false——bool类型的零值是false。

golang的首字母大小写规则与常用的命名规范不相容,典型例子就是一般的成员命名都是首字母小写,这导致golang的项目里最常见的代码之一就是Field type json:"field"。我在V2EX上看见有人以“什么语言都要配置这样的映射作为借口”来搪塞,只能说这反倒暴露出他自己的无知了。

golang把map作为内置类型的做法非常值得商榷。首先为什么偏偏是map?为什么就没有set,list(链表)甚至于queue和stack?所以golang说起来大道至简,实际上处处偏见。尤其是set,明明可以用map简单地包装,但golang就是不包装,结果让114个人弄出514个set。而且在语法层面内置map意味着以后扩展非常困难,且带来了和非原生map语法不一致的问题。

还有别的很多问题,但是这里就不多赘述了。以上的这些问题都是非常影响使用,甚至影响程序正确性的问题,所以golang是最丑的编程语言。

作者:Frodez 链接:https://www.zhihu.com/question/448169628/answer/2258923057


不过,也看到了这样的评论:

不管怎么说,我还是挺喜欢 Go 的节制的。泛型迟迟不出,也有自己的考虑。而且泛型马上来了,很多人又不喜欢了。所以,仔细喜欢就好,不用人云亦云!


推荐阅读


福利

我为大家整理了一份从入门到进阶的Go学习资料礼包,包含学习建议:入门看什么,进阶看什么。关注公众号 「polarisxu」,回复 ebook 获取;还可以回复「进群」,和数万 Gopher 交流学习。

浏览 326
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报