Re: [請益] 為什麼 Go 會紅?

看板Soft_Job作者 (Linus Torvalds)時間6年前 (2018/04/03 23:07), 6年前編輯推噓4(4013)
留言17則, 8人參與, 6年前最新討論串4/6 (看更多)
不敢說會寫,只能說略懂,以下簡單分享。 先說覺得好的地方 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 在哪,只是覺得潮~ -- ※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1522768021.A.54E.html ※ 編輯: LinuxKernel (104.238.184.249), 04/03/2018 23:08:03

04/03 23:12, 6年前 , 1F
go以後應該還是會加進那些常用的功能
04/03 23:12, 1F

04/03 23:12, 6年前 , 2F
但是他的優點其它的語言也是學的很快
04/03 23:12, 2F

04/03 23:14, 6年前 , 3F
我以為goroutine是用coroutine的方式實作的
04/03 23:14, 3F

04/03 23:41, 6年前 , 4F
Mazin Go~
04/03 23:41, 4F

04/04 00:04, 6年前 , 5F
應該説同步和非同步寫法比較精確
04/04 00:04, 5F

04/04 00:04, 6年前 , 6F
真的滿滿都是 if err != nil
04/04 00:04, 6F

04/04 00:04, 6年前 , 7F
blocking vs non-blocking 通常比較指單一function
04/04 00:04, 7F

04/04 00:06, 6年前 , 8F
blocking的function也還可以非同步programming
04/04 00:06, 8F

04/04 00:07, 6年前 , 9F
但是寫的會非常辛苦 寫過一次 就不會想再寫
04/04 00:07, 9F

04/04 00:08, 6年前 , 10F
trylock,select就是幫你減少blocking機會
04/04 00:08, 10F

04/04 04:32, 6年前 , 11F
那個按鈕應該有Plugin支援了吧XD
04/04 04:32, 11F

04/04 11:09, 6年前 , 12F
你的id和你的內文很衝突。linus明明在公開信中都談到
04/04 11:09, 12F

04/04 11:09, 6年前 , 13F
這些c++特性是無關緊要的,你卻反而認為是缺點?
04/04 11:09, 13F

04/04 11:10, 6年前 , 14F
寫linux kernel也是一層層return值回乎,這點go一樣的
04/04 11:10, 14F

04/04 11:11, 6年前 , 15F
你如果沒有辦法堅持本人的觀點就不要掛名,做事做一半
04/04 11:11, 15F

04/04 18:46, 6年前 , 16F
殺小連唉滴都可以戰
04/04 18:46, 16F

04/05 17:32, 6年前 , 17F
沒有generic是我最討厭的地方,再來是沒有overloading
04/05 17:32, 17F
文章代碼(AID): #1QmvYLLE (Soft_Job)
討論串 (同標題文章)
文章代碼(AID): #1QmvYLLE (Soft_Job)