不敢說會寫,只能說略懂,以下簡單分享。
先說覺得好的地方
1. 對 non-blocking 的封裝
大家都知道在 C/C++ 底下要寫出高併發性能的 server 很多細節是很麻煩的
你可能說寫 server 不就開個 socket 搭配 fork 多麼直觀
但現實是要達到好的性能就需要 select、epoll、kqueue 甚至 thread pool 之類的東西
但 non-blocking 的世界畢竟不是那麼直觀
Go 強的地方就在於他讓你用很直觀的 blocking 寫法
一個 client 進來你也就像 fork 一樣給他開個 goroutine
但實際上它底層 runtime 就是用 epoll/kqueue 幫你做掉
也幫你做這些 lightweight thread 的 scheduling
當然 C/C++ 的世界也有類似的 library 可以辦到,像是 Boost.Fiber
但 Go 裡面用 goroutine 搭配 channel 感覺就是優雅了些
不過 goroutine 還是有可能踩到坑的
例如 goroutine 就永遠卡在那邊,這點可以去了解一下它 scheduling 的實作
2. 簡單易寫、靜態語言
Go 的語法相當簡單,keyword 也非常少
等於說讓你用簡單易寫的方式有機會寫出接近 C 效能的應用程式
另外它還是個靜態語言,程式寫久了雖然動態語言寫起來爽
但到頭來私心還是覺得靜態語言更適合做大事 (戰)
3. 跨平台、易部署
有稍微寫過應該就知道,直接編成一個 binary 檔部署真的非常方便
cross-compile 也不是難事
說到覺得不好的地方反而好像可以列出更多
1. 缺少 generic 支援
這點有時候真的很麻煩,頂多只能拿 interface{} 湊合著用
印象中還看過有人還另外開發了一個 generic code generator
例如:https://github.com/cheekybits/genny
不過官方對於 generic 這個議題一直是 open for discussion 狀態
我相信 Go 2 是有機會出現的
討論串:https://github.com/golang/go/issues/15292
2. exception 處理
在 Go 的世界基本上 exception 都是透過 return value 在傳遞的
所以也經常可以看到這種嘲諷的圖片
https://i.imgur.com/EL0gEUD.jpg
有寫過的人看到這圖片一定很有感,程式裡四處都是 if err != nil
實在是每個 Go 開發者都應該有的按鍵!
3. 套件管理
這點在加入 vendor 資料夾的支援後稍微好了一些
也開始出現了一些第三方基於這個設計的 package management tool(例如 Glide)
官方在這部分其實也開始有了動作,未來應該會由 dep 一統天下
dep: https://github.com/golang/dep
而關於套件另一個惱人的問題則是 import path
import "github.com/user/repo/..."
今天如果 upstream 改了 path 就準備炸裂
而且這也讓 open source contribution 麻煩了許多(當你 fork 時)
相關抱怨文:https://bit.ly/2uNrXnA
4. 龜毛
Go 有個我覺得很討厭的堅持
就是如果程式裡有宣告了卻沒有使用到的變數會直接 compile error
動機是想增進 code quality 是好的沒錯
但有時你如果只是為了 debug 這點實在很煩人......
我覺得整體來說還是 Z>B
只是到底換了 Go 是不是能讓你有 gain,這點還是要好好評估的
或許你根本也不知道你的 bottleneck 在哪,只是覺得潮~