声明: 本文不是来吸引口水战的。仅仅是记录水平有限的本人的一些我的观点。Go死忠粉或者口水战爱好者勿入。git
Go 是一个年轻,可是迅速蹿红的语言。我在Go刚出来的时候,出于对其创造者的崇拜,就开始关注了。然而真正使用倒是这两年的事。Docker, kubernetes的出现大大加速了Go流行的速度。由于不少人是由于Go能够用来编写这样复杂度的程序开始关注它的。我相反,13年我是由于有人无心中用Go写了docker才开始关注并最终进入容器这个坑的。github
先谈优势吧
讲优势的目的是为了更过瘾的吐槽,haha
- 没有好用的REPL。 也许静态语言不须要吧。但我已习惯
- 没有好用的debugger。 其实我也不怎么用debugger。可是知道有一个在那儿准备着,想起来用就能够用仍是很好的。delve? 装了N次都无法成功。
- 没有generic。 这个被人说烂了。这玩意对于动态语言不必,可是静态语言就。。。
- 有些脑残的gofmt。 好比自动对齐等号。这个有点自相矛盾。gofmt强制在数组,或者列表的最后一个元素后面要加上逗号。这是很好的,缘由是这样diff看起来会很干净。可是等号自动对齐跟这个彻底是背道而驰啊。在我曾经还很年轻的时候,也喜欢把代码作这样美丽的优化,但结果是被构架师批了一顿。
另外有人知道为何gofmt必定用不一样的风格格式化下面这两段time.Duration
的代码吗?
docker
- C的印记很重。 Go有指针!虽然比C指针安全多了。可是我仍是得懂啊。我还得知道这玩意是地址啊。错误处理也是和C基本同样同样的。总体上讲,Go感受就是像一个改进了的C语言。不知道强制用CamelCase是否是要故意让本身和C区分一下。脑补一下,若是用C经常使用的this_is_a_function来写Go代码是否是就和写C没什么区别了。
- 自动识别interface的实现。 在实现一个interface的时候,无需声明,只要默默的实现其中全部的方法便可。一般来说,显式的老是比隐式的好。Go做者们建议尽可能小的interface,这个是靠谱的。也许正由于如此,做为一个_优雅_的语言,Go不但愿你写出相似这样的语句吧:
struct Foo implements Writer, Reader, Formatter, Transformer, Builder
。 毕竟咱不是Java。
- package management。 为何必定要强制绝对的import 路径?假设我clone了
github/zhangsan/abc
,干脆就无法编译!已无力吐槽...
- channel没有说的那么强悍。 Robe Pike鼓励你们communicate by channel。channel + goroutine确实是不错的设计。可是只说channel, 不提sync,这就有点不厚道了。其实用了goroutine,很快就会发现,该锁的仍是要锁。仍是须要程序猿懂得race condition等等。
-
interface{}
就像是 C 里面的 void *
。对于static typing是一种侵入。
- 创做人员的态度有点。。。精英主义。好比上面说的generic, 好比对一些语法糖的拒绝和不屑。为何我必定要写
list[len(list)-1]
啊,为何就不能有cond? a: b
这样的conditional operator啊。与此同时又创造if a = foo(); a != nil {}
这种几乎惟一的功能就是把一行加长的语法。
- 几乎在鼓励写超长的行, 或者确切的说,鼓励写超长的函数名。若是你看过kubernetes的 代码,你就会看到超过80字符的代码行无处不在,我刚看到时很是惊讶。Go语言是这样要求的,你函数的开始
{
必须在函数名的后面,缩进必须是4个,这样的话,若是你有个很是长的函数名,你只能写在一行,不然后面的行就和函数体自己混在一块儿了。因此,Go基本上是在鼓励你写超长的行。这基本上在全部语言里面都是被鄙视的。我不知道Go做者么是怎么想的。
- 名字。 没法搜索,还和另一个语言冲突,还和围棋的英文冲突。。。。
- camelCase 这篇文章 _find_it_is_much_easier_to_read_something_in_underscores_than_in_camel_case. ButThenAgainThatMightJustBeMe,YouShouldAllLetMeKnowWhatYouThink。但咱们仍是为Go的创造者找个借口吧:CamelCase能少打几个字符。。。
吐完了
不容置疑,Go是一种很实用的语言。其设计者的目的很是明确:创造一种简单易学,上手快,适合blue collar,适合开发分布式程序的语言。策略是以史上最成功的语言C为基础,改进其糟粕(内存管理,安全性,字符串),加入某些现代语言的元素。针对的受众是大型软件团队。从这些角度来说,它无疑是成功的。但仅仅从语言角度来说,Go有不少败笔。编程
写着文章的目的不是要争个谁好谁很差。而是:一来整理记录一些本身的想法;二来证实再NB的人也被他所处的环境,经历,背景,时代等等束缚;三是继续高唱~永远不作脑残粉~。数组
最后,附几个连接:安全
-
对Go语言的综合评价编辑器
- 王垠的评论。虽然我并不承认这人,可是这文章我仍是比较认同的。
-
go-is-not-good分布式
- github上面一个相似awesome XXX的一个集合。只不过是负面的链接集合。