重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
從2013年起,經(jīng)朋友推薦開始用Golang編寫游戲登陸服務(wù)器, 配合C++做第三方平臺驗證. 到編寫?yīng)毩⒐ぞ邔?dǎo)表工具GitHub - davyxu/tabtoy: 跨平臺的高性能便捷電子表格導(dǎo)出器. 以及網(wǎng)絡(luò)庫GitHub - davyxu/cellnet: 簡單,方便,高效的Go語言的游戲服務(wù)器底層. 最終使用這些工具及庫編寫整個游戲服務(wù)器框架, 我的感受是很不錯的
創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計、做網(wǎng)站、成都外貿(mào)網(wǎng)站建設(shè)公司、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的鐵西網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
細節(jié)看來, 有如下的幾個點:
語言, 庫
Golang語言特性和C很像, 簡單, 一張A4紙就能寫完所有特性. 你想想看, C++到了領(lǐng)悟階段, 也只用那幾個簡單特性, 剩下的都是一大堆解決各種內(nèi)存問題的技巧. 而Golang一開始就簡單, 何必浪費生命去研究那一大堆的奇技淫巧呢?
Golang的坑只有2個:1. interface{}和nil配合使用, 2. for循環(huán)時, 將循環(huán)變量引入閉包(Golang, Lua, C#閉包變量捕獲差異) 完全不影響正常使用, 復(fù)合語言概念, 只是看官方后面怎么有效的避免
用Golang就忘記繼承那套東西, 用組合+接口
用Golang服務(wù)器如何保證解決游戲服務(wù)器存盤一致性問題? stop the world是肯定的, 但是Golang可以從語言層并發(fā)序列化玩家數(shù)據(jù), 再通過后臺存盤
channel是goroutine雖然是Golang的語言特性. 但是在編寫服務(wù)器時, 其實只有底層用的比較多.
Golang的第三方庫簡直多如牛毛, 好的也很多
不要說模板了, C#的也不好用, 官方在糾結(jié)也不要加, 使用中, 沒模板確實有點不方便. 用interface{}/反射做泛型對于Golang這種強類型語言來說,還是有點打臉
運行期
Golang和C++比性能的話, 這是C++的優(yōu)勢, Golang因為沒虛擬機, 只有薄薄的一層調(diào)度層. 因此性能是非常高的, 用一點性能犧牲換開發(fā)效率, 妥妥的
1.6版后的GC優(yōu)化的已經(jīng)很好了, 如果你不是高性能,高并發(fā)Web應(yīng)用, 非要找出一堆的優(yōu)化技巧的話. 只用Golang寫點游戲服務(wù)器, 那點GC損耗可以忽略不計
和其他現(xiàn)代語言一樣, 崩潰捕捉是標配功能, 我用Golang的服務(wù)器線上跑, 基本沒碰到過崩潰情況
熱更新: 官方已經(jīng)有plugin系統(tǒng)的提交, 跨平臺的. 估計很快就可以告別手動cgo做so熱更新
開發(fā), 調(diào)試, 部署, 優(yōu)化
LiteIDE是我首選的Golang的IDE, 雖然有童鞋說B格不高. 但這估計實在是找不到缺點說了, 別跟我說Visual Studio, 那是宇宙級的...
曾經(jīng)聽說有人不看好Golang, 我問為啥: 說這么新的語言, 不好招人,后面打聽到他是個策劃... 好吧
真實情況是這樣的: Golang對于有點編程基礎(chǔ)的新人來說, 1周左右可以開始貢獻代碼. 老司機2~3天.
開發(fā)效率還是不錯的, 一般大的游戲功能, 2*2人一周3~4個整完. 這換C++時代, 大概也就1~2個還寫不完. 對接服務(wù)器sdk的話, 大概1天接個10多個沒問題
Golang自帶性能調(diào)優(yōu)工具, 從內(nèi)存, CPU, 阻塞點等幾個方面直接出圖進行分析, 非常直觀, 可以參考我博客幾年前的分析: 使用Golang進行性能分析(Profiling)
Golang支持交叉編譯, 跨平臺部署, 什么概念? linux是吧? 不問你什么版本, 直接windows上編譯輸出一個elf, 甩到服務(wù)器上開跑.不超過1分鐘時間..
1,go的變量聲明順序是:”先寫變量名,再寫類型名“,此與C/C++的語法孰優(yōu)孰劣,可見下文解釋:
2,go是通過package來組織的(與python類似),只有package名為main的包可以包含main函數(shù),一個可執(zhí)行程序有且僅有一個main包,通過import關(guān)鍵字來導(dǎo)入其他非main包。
3,可見性規(guī)則。go語言中,使用大小寫來決定該常量、變量、類型、接口、結(jié)構(gòu)或函數(shù)是否可以被外部包含調(diào)用。根據(jù)約定,函數(shù)名首字母小寫即為private,函數(shù)名首字母大寫即為public。
4,go內(nèi)置關(guān)鍵字(25個均為小寫)。
5,函數(shù)不用先聲明,即可使用。
6,在函數(shù)內(nèi)部可以通過 := 隱士定義變量。(函數(shù)外必須顯示使用var定義變量)
7,go程序使用UTF-8編碼的純Unicode文本編寫。
8,使用big.Int的陷阱:
9,從技術(shù)層面講,go語言的語句是以分號分隔的,但這些是由編譯器自動添加的,不用手動輸入,除非需要在同一行中寫入多個語句。沒有分號及只需少量的逗號和圓括號,使得go語言的程序更容易閱讀。
10,go語言只有一個循環(huán)結(jié)構(gòu)——for循環(huán)。
11,go里的自增運算符只有——“后++”
12,go語言中的slice用法類似python中數(shù)組,關(guān)于slice的詳細用法可見:
13,函數(shù)也是一個值,使用匿名函數(shù)返回一個值。
14,函數(shù)閉包的使用,閉包是一個匿名函數(shù)值,會引用到其外部的變量。
GO是編譯性語言,所以函數(shù)的順序是無關(guān)緊要的,為了方便閱讀,建議入口函數(shù) main 寫在最前面,其余函數(shù)按照功能需要進行排列
GO的函數(shù) 不支持嵌套,重載和默認參數(shù)
GO的函數(shù) 支持 無需聲明變量,可變長度,多返回值,匿名,閉包等
GO的函數(shù)用 func 來聲明,且左大括號 { 不能另起一行
一個簡單的示例:
輸出為:
參數(shù):可以傳0個或多個值來供自己用
返回:通過用 return 來進行返回
輸出為:
上面就是一個典型的多參數(shù)傳遞與多返回值
對例子的說明:
按值傳遞:是對某個變量進行復(fù)制,不能更改原變量的值
引用傳遞:相當于按指針傳遞,可以同時改變原來的值,并且消耗的內(nèi)存會更少,只有4或8個字節(jié)的消耗
在上例中,返回值 (d int, e int, f int) { 是進行了命名,如果不想命名可以寫成 (int,int,int){ ,返回的結(jié)果都是一樣的,但要注意:
當返回了多個值,我們某些變量不想要,或?qū)嶋H用不到,我們可以使用 _ 來補位,例如上例的返回我們可以寫成 d,_,f := test(a,b,c) ,我們不想要中間的返回值,可以以這種形式來舍棄掉
在參數(shù)后面以 變量 ... type 這種形式的,我們就要以判斷出這是一個可變長度的參數(shù)
輸出為:
在上例中, strs ...string 中, strs 的實際值是b,c,d,e,這就是一個最簡單的傳遞可變長度的參數(shù)的例子,更多一些演變的形式,都非常類似
在GO中 defer 關(guān)鍵字非常重要,相當于面相對像中的析構(gòu)函數(shù),也就是在某個函數(shù)執(zhí)行完成后,GO會自動這個;
如果在多層循環(huán)中函數(shù)里,都定義了 defer ,那么它的執(zhí)行順序是先進后出;
當某個函數(shù)出現(xiàn)嚴重錯誤時, defer 也會被調(diào)用
輸出為
這是一個最簡單的測試了,當然還有更復(fù)雜的調(diào)用,比如調(diào)試程序時,判斷是哪個函數(shù)出了問題,完全可以根據(jù) defer 打印出來的內(nèi)容來進行判斷,非??焖伲@種留給你們?nèi)崿F(xiàn)
一個函數(shù)在函數(shù)體內(nèi)自己調(diào)用自己我們稱之為遞歸函數(shù),在做遞歸調(diào)用時,經(jīng)常會將內(nèi)存給占滿,這是非常要注意的,常用的比如,快速排序就是用的遞歸調(diào)用
本篇重點介紹了GO函數(shù)(func)的聲明與使用,下一篇將介紹GO的結(jié)構(gòu) struct
函數(shù)還可以作為返回值,但是在Go語言中不能再像之前那樣定義函數(shù)了,只能定義匿名函數(shù)。匿名函數(shù)就是沒有函數(shù)名的函數(shù)。
閉包 = 函數(shù) + 外層變量的引用
他的臂包原理就是你選擇了他的包裝包之后就會關(guān)閉,必須要下載