關於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的一個集合。只不過是負面的鏈接集合。
相關文章
相關標籤/搜索