為什麼用golang作為遊戲服務端的開發語言,它的並發性如何?golang有什麼優點?

我想了解一下用golang作為遊戲服務端的並發性如何,以及golang的優點


感謝大家邀請。

額,基本上我的觀點跟輪子哥一致,語言對項目的提升並不大,關鍵還是開發經驗和思路。

舉個例子,我之前用Erlang的時候遊戲數據都放內存里,我以為那樣就夠了,一張MySQL表對到一張ETS表,於是上線的時候就坑爹了,表數據一多,負載就上去了,因為大量數據遍歷效率還是不行的。當時又不敢大改,於是我在底層做了一個不需要動到API的邏輯修改,把一個表拆分成100張,才勉強撐過去。

到了用Go的時候,我當然學乖了,數據直接按玩家來切分了,然後表還分了各種類型,比如有的功能數據條目有限,我就犧牲內存空間換執行效率,用數據組而不是列表,數組索引跟數據id做一套編碼,再比如裝備表,一個裝備數據拿出來時候常常要連帶裝備強化信息,比如洗鍊、鑲嵌啥的,於是我利用Go有指針的特性把裝備表設計成父子表結構,一條裝備記錄拉出來的時候自然就連帶著強化數據一起了,但是沒用到這些數據的時候又不需要做拷貝。

如果我繼續用Erlang,那我大概也會把內存資料庫用C做成Erlang的Driver,而不再用ETS。

所以就像輪子哥說的,語言只是一個幻覺,讓人覺得用了就沒問題了,其實決定因素不在語言,在程序演算法和結構上。

做服務端開發還是得越做越往底層走的,底層的技術搞懂了,語言之前的區別就只是招人難不難,用起來開不開心的問題而已。

Go的並發性能語法優勢之類的,網上已經很多人誇了,我這裡說一個比較少人提的優點。

Go可以讓不熟悉底層的程序員平滑的接觸和深入底層。

在一開始只學會Go,掌握基本的語法以及編程技巧,比如避免遍歷、避免數據拷貝等,就可以做出很好用的服務端程序了。

要進一步追求性能,那就可以挖開Go的源代碼,看其內部實現,再配合Go提供的pprof工具分析項目。Go的代碼很清晰,分析工具也很好用,到了這個階段你就不再需要聽別人說哪個好哪個不好了,你自己會有自己判斷的。

Go提供一個功能叫cgo,可以讓Go快速的對接C/C++寫的庫,我是從cgo才逐漸熟悉C/C++的,比較奇葩的學習路線,但是學習曲線不會那麼陡峭,一邊學就可以一邊產出代碼見到成效。

選了Go就相當於選了一條比較平緩的路線,但是不管用什麼語言或技術做服務端,每個路徑肯定都是指向系統底層的,就看怎麼走而已。


你想想,如果你對怎麼用C語言寫高並發程序一無所知,你上golang就可以自動寫出高並發程序了?其實很多時候幻覺就發生在這裡。

我當初用delphi的時候還是個傻逼,現在用C++已經牛逼了,有時候我就總是會覺得C++寫出來的程序就是比delphi的bug少,雖然這顯然不成立。


補充我們項目選擇Go時很看重的一點:Go的一些務實的設定對工程實踐很友好。

比如沒有warning,比如統一的代碼風格,比如禁止包的循環依賴,比如未被使用的import會編譯不通過,比如map的遍歷順序是隨機的。

這些設定對提高代碼的簡潔和可維護性很有幫助,回想到c++時代要求新人看完Google代碼規範再開工最後還是每個人都有自己的代碼風格,還得每隔一段時間清理warning、時不時清理沒用的include,重編一次的時間可以喝一杯咖啡……已經完全回不去了。


Golang 簡單,入門門檻低好招人,學過PHP或者是Python的,學Golang應該很好上手

我剛看了幾章 謝 的書,沒記錯的話,interface ,slice,map應該是最重要的語法姿勢了。

至於並發嘛,我就只能呵呵了,我是搞Erlang的。

至於schedule什麼的,不見得孰勝孰劣,關鍵還是看需求場景。

Erlang很難招人,Golang就沒那麼困難了。

知道的,因為招不到Erlang程序員,不得已轉Golang的,有若干;不得已轉PHP的有若干。不勝枚舉。

手游,頁游,有用Erlang的,也有用Golang的。Golang的錯誤機制,異常處理,容錯保護,這些,我現在還真不熟悉(求教大牛)。但是,Erlang的這些特性,我是深有體會,也遠程幫基友定位過內存消耗過大的進程代碼。這些都非常nice。

說著說著,就鼓吹Erlang怎麼好了,算了,打住了。

Erlang也有很多深坑,說多了都是淚的那種。

-------------------------------------------------------------------------------------

問題評論里,邀請了 @達達

再次邀請

沒記錯的話,之前神仙道是用Erlang,現在他們team換成Golang了

達達應該很有資格回答這個問題的。

先謝謝 @達達


我投奔Go的原因是:(按打動我的力度倒排序,我切實體會到好處的時間正排序)

函數可以返回多個值(看許世偉的書,最早就看到這個特點,心想這個很贊,我要學)

寫並發簡單(然後看到這個特點,心想這個好,我要用)

語法簡單易學(開始認真學了,體會到這個特點了)

錯誤處理機制(實際項目里發現error ,panic ,recover 真好用)

部署簡單(再也不用檢查這版本那環境了,即丟即運行!)

跨平台編譯(第三個實際項目生產環境是win,在Mac刷刷刷就編譯出exe來了,不用開虛擬機了,爽!)


golang相對c, c++,要簡單很多,對開發者的要求降低許多,對『牛人』的需求降低。

想像下,讓一個水平一般的開發者用c或者c++去獨立開發一個高並發的伺服器端比較困難,但是用golang就容易許多。不用依賴其他第三方庫,僅僅用golang自帶的package和功能就可以開發一個高性能的server端,何樂而不為呢。


正在使用golang開發伺服器(手游)

就算是並發模型好也只是針對http這種無狀態的鏈接來說的


推薦閱讀:

golang的goroutine是如何實現的?
有哪些公司在用 Google 的 Go 語言?成熟度和 Erlang 比起來如何?
go語言以後會不會成為主流web開發語言?
go語言如何開發帶UI的軟體?
Google的新操作系統Fuchsia沒有使用Go語言開發,Go作為系統開發語言的定位是否已經失敗?

TAG:信息技術IT | Go語言 |