有好幾次,當(dāng)我想起來(lái)的時(shí)候,總是會(huì)問(wèn)自己:我為什么要放棄Go語(yǔ)言?這個(gè)決定是正確的嗎?是明智和理性的嗎?其實(shí)我一直在認(rèn)真思考這個(gè)問(wèn)題。
創(chuàng)新互聯(lián)-企業(yè)級(jí)云服務(wù)器提供商,為用戶提供云服務(wù)器、CDN、云安全服務(wù)、中國(guó)電信成都樞紐中心、服務(wù)器租用、高防服務(wù)器租用等全方位云服務(wù)與各行業(yè)解決方案,幫助企業(yè)及個(gè)人極速備案,輕松上云,安全無(wú)憂。
開(kāi)門(mén)見(jiàn)山地說(shuō),我當(dāng)初放棄Go語(yǔ)言(golang),就是因?yàn)閮蓚€(gè)“不爽”:第一,對(duì)Go語(yǔ)言本身不爽;第二,對(duì)Go語(yǔ)言社區(qū)里的某些人不爽。毫無(wú)疑問(wèn),這是非常主觀的結(jié)論。轉(zhuǎn)載
1.1 不允許閉舉遲左花括號(hào)另起一行
1.2 編譯器莫名其妙地給行尾加上分號(hào)
1.3 極度強(qiáng)調(diào)編譯速度,不惜放棄本應(yīng)提供的功能
1.4 錯(cuò)誤處理機(jī)制太原始
1.5 垃圾回收器(GC)不完善、有重大缺陷
1.6 禁止未使用變量和多余import
1.7 創(chuàng)建對(duì)象的方式太多令人糾結(jié)
1.8 對(duì)象沒(méi)有構(gòu)造函數(shù)和析構(gòu)函數(shù)
1.9 defer語(yǔ)句的語(yǔ)義設(shè)定不甚合理
1.10 許多語(yǔ)言?xún)?nèi)置設(shè)施不答純支持用戶定義的類(lèi)型
1.11 沒(méi)有泛型支持,常見(jiàn)數(shù)據(jù)類(lèi)型接口丑陋
1.12 實(shí)現(xiàn)接口不需要明確聲明轎李
1.13 省掉小括號(hào)卻省不掉花括號(hào)
1.14 編譯生成的可執(zhí)行文件尺寸非常大
1.15 不支持動(dòng)態(tài)加載類(lèi)庫(kù)
報(bào)錯(cuò)信息如下:
[logid: 3628171316][json.err: EOF] [exception:EOF] goroutine 20521 [running]:
原因:
在清陸請(qǐng)求體為json的請(qǐng)求中,調(diào)用了parsePostForm方法,方法大致內(nèi)容如下:
在這個(gè)方法中,會(huì)讀取http的請(qǐng)睜正清求體。
在這里被讀取的時(shí)候,后面又重新讀取一次,之后解json
后面讀到的請(qǐng)求體是空的,解json的時(shí)悉前候就會(huì)報(bào)錯(cuò)EOF
總結(jié):golang中http請(qǐng)求報(bào)錯(cuò)eof,多半是因?yàn)槎啻巫x取了請(qǐng)求體
一.幾種公共方法
1)Print:???輸出到控制臺(tái)(不接受任何格式化,它等價(jià)于對(duì)每一個(gè)操作數(shù)都應(yīng)用?%v)
print 在golang中?是屬于輸出到標(biāo)準(zhǔn)錯(cuò)誤流中并打印,官方不建議寫(xiě)程序時(shí)候用它??梢栽賒ebug時(shí)候用
2)Println:?輸出到控制臺(tái)并換行
3)Printf :?只可以打印出格式化的森稿字符串。只可以直接輸出字符串類(lèi)型的變量(不可以輸出整形變量和整形等)
4)Sprintf:格式化并返回一個(gè)字符串而不帶任何輸出
5)Fprintf:來(lái)格式化并輸出到 io.Writers 而不是 os.Stdout
二.帶占位符輸出--網(wǎng)址:? ??
和python差不多的道理,這里簡(jiǎn)單補(bǔ)充
v ????值的默認(rèn)格式
%+v???添加字段名(如盯凱結(jié)構(gòu)體)
%#v ?相應(yīng)值的Go語(yǔ)法表示?
%T????相應(yīng)值的類(lèi)型的Go語(yǔ)法表示?
%%????字面上的百分號(hào),并非值的占位符
%c?????相應(yīng)Unicode碼點(diǎn)所表示的字符?
%x??此則孝???十六進(jìn)制表示,字母形式為小寫(xiě) a-f
%X?????十六進(jìn)制表示,字母形式為大寫(xiě) A-F
%U???? Unicode格式:U+1234,等同于?"U+%04X"
從2013年起,經(jīng)朋友推薦開(kāi)始用Golang編寫(xiě)游戲登陸服務(wù)器, 配合C++做第三方平臺(tái)驗(yàn)證. 到編寫(xiě)?yīng)毩⒐ぞ邔?dǎo)表工具GitHub - davyxu/tabtoy: 跨平臺(tái)的高性能便捷電子表格導(dǎo)出器. 以及網(wǎng)絡(luò)庫(kù)GitHub - davyxu/cellnet: 簡(jiǎn)單,方便,高效的Go語(yǔ)言的游戲服務(wù)器底層. 最終使用這些工具及庫(kù)編寫(xiě)整個(gè)游戲服務(wù)器框架, 我的感受是很不錯(cuò)的
細(xì)節(jié)型梁派看來(lái), 有如下的幾個(gè)點(diǎn):
語(yǔ)言, 庫(kù)
Golang語(yǔ)言特性和C很像, 簡(jiǎn)單, 一張A4紙就能寫(xiě)完所有特性. 你想想看, C++到了領(lǐng)悟階段, 也只用那幾個(gè)簡(jiǎn)單特性, 剩下的都是一大堆解決各種內(nèi)存問(wèn)題的技巧. 而Golang一開(kāi)始就簡(jiǎn)單, 何必浪費(fèi)生命去渣好研究那一大堆的奇技淫巧呢?
Golang的坑只有2個(gè):1. interface{}和nil配合使用, 2. for循環(huán)時(shí), 將循環(huán)變量引入閉包(Golang, Lua, C#閉包變量捕獲差異) 完全不影響正常使用, 復(fù)合語(yǔ)言概念, 只是看官方后面怎么有效的避免
用Golang就忘記繼承那套東西, 用組合+接口
用Golang服務(wù)器如何保證解決游戲服務(wù)器存盤(pán)一致性問(wèn)題? stop the world是肯定的, 但是Golang可以從語(yǔ)言層并發(fā)序列化玩家數(shù)據(jù), 再通過(guò)后臺(tái)存盤(pán)
channel是goroutine雖然是Golang的語(yǔ)言特性. 但是在編寫(xiě)服務(wù)器時(shí), 其實(shí)只有底層用的比較多.
Golang的第三方庫(kù)簡(jiǎn)直多如牛毛, 好的也很多
不要說(shuō)模板了, C#的也不好用, 官方在糾結(jié)也不要加, 使用中, 沒(méi)模板確實(shí)有點(diǎn)不方便. 用interface{}/反射做泛型對(duì)于Golang這種強(qiáng)類(lèi)型語(yǔ)言來(lái)說(shuō),還是有點(diǎn)打臉
運(yùn)行期
Golang和C++比性能的話, 這是C++的優(yōu)勢(shì), Golang因?yàn)闆](méi)虛擬機(jī), 只有薄薄的一層調(diào)卜賀度層. 因此性能是非常高的, 用一點(diǎn)性能犧牲換開(kāi)發(fā)效率, 妥妥的
1.6版后的GC優(yōu)化的已經(jīng)很好了, 如果你不是高性能,高并發(fā)Web應(yīng)用, 非要找出一堆的優(yōu)化技巧的話. 只用Golang寫(xiě)點(diǎn)游戲服務(wù)器, 那點(diǎn)GC損耗可以忽略不計(jì)
和其他現(xiàn)代語(yǔ)言一樣, 崩潰捕捉是標(biāo)配功能, 我用Golang的服務(wù)器線上跑, 基本沒(méi)碰到過(guò)崩潰情況
熱更新: 官方已經(jīng)有plugin系統(tǒng)的提交, 跨平臺(tái)的. 估計(jì)很快就可以告別手動(dòng)cgo做so熱更新
開(kāi)發(fā), 調(diào)試, 部署, 優(yōu)化
LiteIDE是我首選的Golang的IDE, 雖然有童鞋說(shuō)B格不高. 但這估計(jì)實(shí)在是找不到缺點(diǎn)說(shuō)了, 別跟我說(shuō)Visual Studio, 那是宇宙級(jí)的...
曾經(jīng)聽(tīng)說(shuō)有人不看好Golang, 我問(wèn)為啥: 說(shuō)這么新的語(yǔ)言, 不好招人,后面打聽(tīng)到他是個(gè)策劃... 好吧
真實(shí)情況是這樣的: Golang對(duì)于有點(diǎn)編程基礎(chǔ)的新人來(lái)說(shuō), 1周左右可以開(kāi)始貢獻(xiàn)代碼. 老司機(jī)2~3天.
開(kāi)發(fā)效率還是不錯(cuò)的, 一般大的游戲功能, 2*2人一周3~4個(gè)整完. 這換C++時(shí)代, 大概也就1~2個(gè)還寫(xiě)不完. 對(duì)接服務(wù)器sdk的話, 大概1天接個(gè)10多個(gè)沒(méi)問(wèn)題
Golang自帶性能調(diào)優(yōu)工具, 從內(nèi)存, CPU, 阻塞點(diǎn)等幾個(gè)方面直接出圖進(jìn)行分析, 非常直觀, 可以參考我博客幾年前的分析: 使用Golang進(jìn)行性能分析(Profiling)
Golang支持交叉編譯, 跨平臺(tái)部署, 什么概念? linux是吧? 不問(wèn)你什么版本, 直接windows上編譯輸出一個(gè)elf, 甩到服務(wù)器上開(kāi)跑.不超過(guò)1分鐘時(shí)間..