关于Go语言

声明: 本文不是来吸引口水战的。仅仅是记录水平有限的本人的一些我的观点。Go死忠粉或者口水战爱好者勿入。git

Go 是一个年轻,可是迅速蹿红的语言。我在Go刚出来的时候,出于对其创造者的崇拜,就开始关注了。然而真正使用倒是这两年的事。Docker, kubernetes的出现大大加速了Go流行的速度。由于不少人是由于Go能够用来编写这样复杂度的程序开始关注它的。我相反,13年我是由于有人无心中用Go写了docker才开始关注并最终进入容器这个坑的。github

先谈优势吧

  • 简单(很是)的语法。 比Go语法还简单的很少了。不少其它高级语言认为必须有的语法,如class, exception都被有意的干掉了。这样致使了学习成本的下降。不少程序猿不须要多少时间就能够上岗,并贡献有用的代码。
  • static typing。 static typing 对大型程序,尤为是大型团队仍是有意义的。
  • bound checking。 安全第一,安全第一
  • 不错的tool chain。 包括各自独立的小工具,使得用Vim之类的编辑器也能够有很好的体验。编译很是快,虽然有GOPATH这个坑,但也能忍了。
  • 静态可执行文件。 这个从部署的角度来说,比较起其它语言,如Python等等来讲,太容易了。可是有时候 你仍是得像C同样用特殊的命令行:golang

  • channel + goroutine。 其实全部的语言均可以作到这个,可是将它们提高到语法的层面确实使得这类的编程变得简单了许多。

讲优势的目的是为了更过瘾的吐槽,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的人也被他所处的环境,经历,背景,时代等等束缚;三是继续高唱~永远不作脑残粉~数组

最后,附几个连接:安全

  1. 对Go语言的综合评价编辑器

    • 王垠的评论。虽然我并不承认这人,可是这文章我仍是比较认同的。
  2. go-is-not-good分布式

    • github上面一个相似awesome XXX的一个集合。只不过是负面的链接集合。
相关文章
相关标签/搜索