使用Golang开发手游服务器的感想
? ? ? ? 從最初決定使用Golang開發(fā)游戲服務(wù)器(參考這里),到服務(wù)器基本成型,經(jīng)過了兩個多禮拜的時間。這里記錄一下感想和心得。具體Golang的使用經(jīng)驗將來有時間會再開篇文章來寫。
? ? ? ? 兩個禮拜的時間,完成了Golang的入門,服務(wù)器框架設(shè)計,功能的完整移植,從我個人角度來說,要給Golang和我自己100個贊。
? ? ? ? 最初我選定Golang就是考慮到它有以下優(yōu)點;
1、靜態(tài)編譯型語言。這個是我最看重的,不選擇skynet(c+lua)和KBEngine(c++ python)有很大一個原因是動態(tài)腳本語言維護(hù)邏輯復(fù)雜了維護(hù)起來非常困難。 靜態(tài)語言基本編譯通過后就沒有太大問題了,剩下的就是思考不周導(dǎo)致的bug。
2、堪比python的開發(fā)效率。 ?不選java很大的一個原因是這個。 ?我不需要最優(yōu)方案,也不需要最穩(wěn)妥的方案,只需要一個合適的方案。
3、并發(fā)模型,可以輕易利用起多核。 不選Node.js的原因是callback還沒有真正完善的解決方案
4、有現(xiàn)成的開源服務(wù)器。即便不說有成功案例,至少是有可行的案例
5、優(yōu)異的跨平臺能力。 ?我想部署KBEngine到linux,結(jié)果python編譯了半天都沒成功。(順便吐槽下linux,不同發(fā)行版本,軟件源中的軟件名不一樣,操作命令和習(xí)慣也不一樣,簡直是作)
6、部署方便,只要把執(zhí)行文件拷貝一下就可以了,沒有太多的依賴或者動態(tài)庫。同樣參考上一條。
7、支持protobuf、mongoDB。KBEngine中我一直想做這個修改,不過改動太大,完全Hold不住。這個不算特別的優(yōu)點,因為很多其他的方案也都支持,只不過恰好不謀而合而已。
? ? ? ?而最后的結(jié)果也基本滿意。
? ? ? ?Golang并不是一個完美的語言,甚至從c++系轉(zhuǎn)過來的人會感覺很多不爽,尤其是詭異的變量命名規(guī)則。
? ? ? ?不過Golang是一個解決實際問題的工業(yè)級語言。可能語法上面看各種粗糙,但是習(xí)慣后使用起來非常順手。它在解決網(wǎng)絡(luò)大并發(fā)問題的基礎(chǔ)上(go 協(xié)程),同時兼顧了靜態(tài)語言的優(yōu)勢和堪比Python的開發(fā)效率,從這點上來說再怎么稱贊它都不為過。 在這個巨大優(yōu)勢的前提下,其他的一些不爽都是可以接受和忽略的。 其他的如Rust、Scala等,雖然語法、語義更棒,但是并不能解決我碰到的實際問題(并不是說它不能解決任何問題),只有Golang將這三者完美的融合在一起。
? ? ? ? 關(guān)于Golang的入門,我總結(jié)了三點需要注意的:
1、包和GOPATH。 ?
? ? ? Golang并沒有項目工程文件,它通過自動解析包引用構(gòu)建整個項目。一個文件夾對應(yīng)一個包,一個包對應(yīng)一個模塊,模塊內(nèi)可以定義各種結(jié)構(gòu)和函數(shù)。 ?而main包就是程序的主入口,它包含一個main函數(shù)。?
? ? ? GOPATH是go查找包的路徑,我現(xiàn)在設(shè)置兩個路徑,一個是當(dāng)前項目路徑,一個是公共包的路徑。go在編譯的時候會依次查找對應(yīng)路徑下有沒有這個包。 ?go build和go install可以構(gòu)建程序。 一個項目中可以包含多個main包,也就對應(yīng)多個進(jìn)程。比如我的服務(wù)器項目中就對應(yīng)login gate game三個進(jìn)程。
? ? ? 理解了包和GOPATH就可以非常方便的維護(hù)整個項目
2、指針和內(nèi)存
? ? ? Golang中有指針的概念(這點我并不喜歡,感覺還不如像c#或者java一樣直接干掉指針,只有對象的概念)。但是指針的功能極度弱化,你可以像正常對象調(diào)用一樣使用指針,不能操作指針的內(nèi)存,也不能對指針進(jìn)行自增等操作。 指針的意義就是傳遞參數(shù)是防止值傳遞,也就說Golang的指針就相當(dāng)于c++中的引用。
? ? ? 同樣的,你并不能控制一個對象是在堆上創(chuàng)建還是在棧上創(chuàng)建。Golang中new(TestStruct)和&TestStruct{}是完全等價的寫法。只不過后一個寫法可以同時進(jìn)行初始化操作。 創(chuàng)建出的內(nèi)存都是交給GC來進(jìn)行管理的。 所以返回局部對象的指針是完全合法和正確的。
3、Struct和interface{}
type User Struct {name string }func (self *User) login(account string, token string) { }
? ? ?通過這樣的寫法就定義了一個結(jié)構(gòu)User,并且這個結(jié)構(gòu)有一個成員函數(shù)login。 ?通過包、Struct、包函數(shù)、成員函數(shù)這四個元素就可以輕松的處理對象和框架設(shè)計。
? ? ? 接口是Golang中非常強大的語法特性,一個Struct只要實現(xiàn)了一個接口(函數(shù)名和參數(shù)相同)就可以當(dāng)做這個接口來使用。 通過接口,大大減輕了設(shè)計負(fù)擔(dān),不需要設(shè)計模式,一樣可以寫出高質(zhì)量的優(yōu)雅的代碼
? ? ??
總結(jié)
以上是生活随笔為你收集整理的使用Golang开发手游服务器的感想的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 行人重识别(3)——行人重识别(基于图像
- 下一篇: Win10开启黑色护眼暗黑主题