每種語言都有自己的側(cè)重點(diǎn),如果可以的話建議題主還是分開學(xué),循序漸進(jìn),如果學(xué)習(xí)同時(shí)學(xué)習(xí)三種語言,容易記混不說,反而容易導(dǎo)致學(xué)習(xí)進(jìn)度停滯不前。
10余年的??诰W(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都全網(wǎng)營銷的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整??诮ㄕ镜娘@示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)從事“??诰W(wǎng)站設(shè)計(jì)”,“海口網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
知了姐就來跟大家詳細(xì)說說java,python,go三種語言之間的區(qū)別,僅供題主參考~
01 Python
難度:★
歡迎度:★★★★☆
創(chuàng)始于:1991年
**學(xué)完之后可以干什么:**web開發(fā)、應(yīng)用開發(fā)、大數(shù)據(jù)、數(shù)據(jù)挖掘、科學(xué)計(jì)算、機(jī)器學(xué)習(xí)、人工智能、運(yùn)維、自然語言處理等等等。
Python的優(yōu)點(diǎn):
? 易于學(xué)習(xí):就像論壇里有些人說的,做了幾年Java或者是C++的,幾天就可以寫Python了。但是這個(gè)不是什么壞事,入門來說,從簡入難,或者從難入簡,都是很好的選擇。
? 庫:庫都是免費(fèi)的,并且有很多庫和函數(shù)把編程變得相對(duì)容易很多。
? 物聯(lián)網(wǎng):Python也許是會(huì)成為物聯(lián)網(wǎng)當(dāng)中最受歡迎的語言,我們都知道樹莓派這樣的新平臺(tái)都是基于Python開發(fā)的。
Python的缺點(diǎn):
速度:開發(fā)速度是快,比如java100行代碼python20行就搞定了。但是作為解釋型的語言來說,比編譯型語言的速度慢很多。
? 移動(dòng)端:Python在移動(dòng)計(jì)算方面是弱的,很少有智能機(jī)的應(yīng)用是Python開發(fā)的
? 設(shè)計(jì):python是動(dòng)態(tài)型的語言,需要更多的測試以及錯(cuò)誤僅僅是在運(yùn)行的時(shí)候展示的。
02 JAVA
難度:★ ★ ★
歡迎度:★ ★ ★ ★ ★
創(chuàng)始于:1995年
Java可以做什么:**安卓和IOS的應(yīng)用開發(fā)、視頻游戲開發(fā)、桌面GUI、軟件開發(fā)等等;
Java是老牌語言,但是由于市場上相關(guān)開發(fā)人才較多,競爭激烈,薪資趨于平穩(wěn)。
Java的優(yōu)點(diǎn):
? Java開發(fā)人員需求量大:這個(gè)是根據(jù)統(tǒng)計(jì)得出的。JAVA在很多語言當(dāng)中,是需求量最大的;
? 進(jìn)化語言:首先C++是基于C語言優(yōu)化的,Java是被優(yōu)化過來的。而且在這人平臺(tái)是增加了很多的功能,lambda等功能
? 安卓應(yīng)用開發(fā):谷歌的安卓移動(dòng)平臺(tái)是世界第一的移動(dòng)平臺(tái),編寫安卓應(yīng)用開發(fā)者使用的主要語言是Java;
Java的缺點(diǎn):
? 使用大量的內(nèi)存:Java和C++相比使用更多的內(nèi)存所以占用的內(nèi)存就更大
? 學(xué)習(xí)曲線:這邊指的是Java雖然不是最簡單的入門語言,但是也不是最難
? 啟動(dòng)時(shí)間慢:用java寫過安卓的應(yīng)用的人應(yīng)該都知道。同樣的代碼在模擬器中啟動(dòng)是非常緩慢的事情。
03 GO語言
難度:★
歡迎度:★★★★☆
創(chuàng)始于:2007年
go語言的難度,相對(duì)來說,GO語言不難的。
可是GO語言的學(xué)習(xí)資料相對(duì)其他的語言來說很少,所以學(xué)習(xí)起來沒有其他的語言那么便利;
很多人說GO語言在國內(nèi)更火,按照數(shù)據(jù)來說,是的。因?yàn)橹袊硕?,基?shù)大。其實(shí)GO在國外更火。對(duì)于現(xiàn)在來說,GO實(shí)際上也已經(jīng)站穩(wěn)腳跟了。不管是Google自帶光環(huán)也好,實(shí)際應(yīng)用也好。go算是找到了屬于自己的空間。
golang相對(duì)其他語言來說,招聘職位還是較少。
GO語言的優(yōu)點(diǎn):
? 編譯時(shí)間快:GO語言編寫最大的微服務(wù)的時(shí)間大概需要6秒,相對(duì)Java和C++呆滯的編譯速度來說,GO語言快速編譯是主要的效率優(yōu)勢。
? 并發(fā)性和通道:GO語言的logo大家可以了解一下,它就是致力于事情簡單化,也就是快。其實(shí)并沒有引入很多的新的概念。就是打造一門簡單的語言,使用起來很快。在goroutine上運(yùn)行一個(gè)函數(shù)最小的樣板代碼,我們只需要使用關(guān)鍵詞go添加函數(shù)調(diào)用:
? 生態(tài)系統(tǒng)也是很強(qiáng)大的:面向Redis、RabbitMQ、Template等等很多穩(wěn)定的庫。有很強(qiáng)大的工具支持。
GO語言的缺點(diǎn):
? 缺少框架:GO是沒有一個(gè)主要的框架。但是很多人認(rèn)為不應(yīng)該從框架的使用開始。也可以從社區(qū)的討論了解一下這個(gè)問題。
? 錯(cuò)誤處理:在錯(cuò)誤處理方式,很容易丟失錯(cuò)誤發(fā)生范圍,所以在編程過程中很難向用戶提供出有意義的錯(cuò)誤信息。
? 軟件包管理:在默認(rèn)的情況下,沒有辦法制定特定版本的依賴庫,也沒有辦法創(chuàng)建可以復(fù)寫的builds。
前期,咱們可以熟練掌握一門語言先找到合適的工作,拿到滿意的薪水,穩(wěn)定之后咱們逐漸就可以學(xué)習(xí)更多的語言,豐富技能~
Go 由于不支持泛型而臭名昭著,但最近,泛型已接近成為現(xiàn)實(shí)。Go 團(tuán)隊(duì)實(shí)施了一個(gè)看起來比較穩(wěn)定的設(shè)計(jì)草案,并且正以源到源翻譯器原型的形式獲得關(guān)注。本文講述的是泛型的最新設(shè)計(jì),以及如何自己嘗試泛型。
例子
FIFO Stack
假設(shè)你要?jiǎng)?chuàng)建一個(gè)先進(jìn)先出堆棧。沒有泛型,你可能會(huì)這樣實(shí)現(xiàn):
type?Stack?[]interface{}func?(s?Stack)?Peek()?interface{}?{
return?s[len(s)-1]
}
func?(s?*Stack)?Pop()?{
*s?=?(*s)[:
len(*s)-1]
}
func?(s?*Stack)?Push(value?interface{})?{
*s?=?
append(*s,?value)
}
但是,這里存在一個(gè)問題:每當(dāng)你 Peek 項(xiàng)時(shí),都必須使用類型斷言將其從 interface{} 轉(zhuǎn)換為你需要的類型。如果你的堆棧是 *MyObject 的堆棧,則意味著很多 s.Peek().(*MyObject)這樣的代碼。這不僅讓人眼花繚亂,而且還可能引發(fā)錯(cuò)誤。比如忘記 * 怎么辦?或者如果您輸入錯(cuò)誤的類型怎么辦?s.Push(MyObject{})` 可以順利編譯,而且你可能不會(huì)發(fā)現(xiàn)到自己的錯(cuò)誤,直到它影響到你的整個(gè)服務(wù)為止。
通常,使用 interface{} 是相對(duì)危險(xiǎn)的。使用更多受限制的類型總是更安全,因?yàn)榭梢栽诰幾g時(shí)而不是運(yùn)行時(shí)發(fā)現(xiàn)問題。
泛型通過允許類型具有類型參數(shù)來解決此問題:
type?Stack(type?T)?[]Tfunc?(s?Stack(T))?Peek()?T?{
return?s[len(s)-1]
}
func?(s?*Stack(T))?Pop()?{
*s?=?(*s)[:
len(*s)-1]
}
func?(s?*Stack(T))?Push(value?T)?{
*s?=?
append(*s,?value)
}
這會(huì)向 Stack 添加一個(gè)類型參數(shù),從而完全不需要 interface{}?,F(xiàn)在,當(dāng)你使用 Peek() 時(shí),返回的值已經(jīng)是原始類型,并且沒有機(jī)會(huì)返回錯(cuò)誤的值類型。這種方式更安全,更容易使用。(譯注:就是看起來更丑陋,^-^)
此外,泛型代碼通常更易于編譯器優(yōu)化,從而獲得更好的性能(以二進(jìn)制大小為代價(jià))。如果我們對(duì)上面的非泛型代碼和泛型代碼進(jìn)行基準(zhǔn)測試,我們可以看到區(qū)別:
type?MyObject?struct?{
X?
int
}
var?sink?MyObjectfunc?BenchmarkGo1(b?*testing.B)?{
for?i?:=?0;?i??b.N;?i++?{
var?s?Stack
s.Push(MyObject{})
s.Push(MyObject{})
s.Pop()
sink?=?s.Peek().(MyObject)
}
}
func?BenchmarkGo2(b?*testing.B)?{
for?i?:=?0;?i??b.N;?i++?{
var?s?Stack(MyObject)
s.Push(MyObject{})
s.Push(MyObject{})
s.Pop()
sink?=?s.Peek()
}
}
結(jié)果:
BenchmarkGo1BenchmarkGo1-16?????12837528?????????87.0?ns/op???????48?B/op????????2?allocs/opBenchmarkGo2BenchmarkGo2-16?????28406479?????????41.9?ns/op???????24?B/op????????2?allocs/op
在這種情況下,我們分配更少的內(nèi)存,同時(shí)泛型的速度是非泛型的兩倍。
合約(Contracts)
上面的堆棧示例適用于任何類型。但是,在許多情況下,你需要編寫僅適用于具有某些特征的類型的代碼。例如,你可能希望堆棧要求類型實(shí)現(xiàn) String() 函數(shù)
薪資報(bào)酬:
字節(jié)跳動(dòng)工資待遇,在職朋職業(yè)圈上已有125位圈友現(xiàn)身分享,根據(jù)網(wǎng)友分享統(tǒng)計(jì),字節(jié)跳動(dòng)平均工資為15686元/月,其中31%的工資收入位于區(qū)間8000-12000元/月,24%的工資收入位于區(qū)間8000元/月以下。據(jù)分析數(shù)據(jù)統(tǒng)計(jì),字節(jié)跳動(dòng)年終獎(jiǎng)平均30838元。 字節(jié)跳動(dòng)員工分享說:薪酬體系比較完善,在職期間未漲過工資,漲薪應(yīng)該是伴隨著職級(jí)升級(jí)實(shí)現(xiàn)的,或者重大業(yè)務(wù)項(xiàng)目取得較大進(jìn)展時(shí)可能會(huì)漲薪,實(shí)習(xí)生接觸不到那么多
前段時(shí)間在golang-China讀到這個(gè)貼:
個(gè)人覺得golang十分適合進(jìn)行網(wǎng)游服務(wù)器端開發(fā),寫下這篇文章總結(jié)一下。
從網(wǎng)游的角度看:
要成功的運(yùn)營一款網(wǎng)游,很大程度上依賴于玩家自發(fā)形成的社區(qū)。只有玩家自發(fā)形成一個(gè)穩(wěn)定的生態(tài)系統(tǒng),游戲才能持續(xù)下去,避免鬼城的出現(xiàn)。而這就需要多次大量導(dǎo)入用戶,在同時(shí)在線用戶量達(dá)到某個(gè)臨界點(diǎn)的時(shí)候,才有可能完成。因此,多人同時(shí)在線十分有必要。
再來看網(wǎng)游的常見玩法,除了排行榜這類統(tǒng)計(jì)和數(shù)據(jù)匯總的功能外,基本沒有需要大量CPU時(shí)間的應(yīng)用。以前的項(xiàng)目里,即時(shí)戰(zhàn)斗產(chǎn)生的各種傷害計(jì)算對(duì)CPU的消耗也不大。玩家要完成一次操作,需要通過客戶端-服務(wù)器端-客戶端這樣一個(gè)來回,為了獲得高響應(yīng)速度,滿足玩家體驗(yàn),服務(wù)器端的處理也不能占用太多時(shí)間。所以,每次請(qǐng)求對(duì)應(yīng)的CPU占用是比較小的。
網(wǎng)游的IO主要分兩個(gè)方面,一個(gè)是網(wǎng)絡(luò)IO,一個(gè)是磁盤IO。網(wǎng)絡(luò)IO方面,可以分成美術(shù)資源的IO和游戲邏輯指令的IO,這里主要分析游戲邏輯的IO。游戲邏輯的IO跟CPU占用的情況相似,每次請(qǐng)求的字節(jié)數(shù)很小,但由于多人同時(shí)在線,因此并發(fā)數(shù)相當(dāng)高。另外,地圖信息的廣播也會(huì)帶來比較頻繁的網(wǎng)絡(luò)通信。磁盤IO方面,主要是游戲數(shù)據(jù)的保存。采用不同的數(shù)據(jù)庫,會(huì)有比較大的區(qū)別。以前的項(xiàng)目里,就經(jīng)歷了從MySQL轉(zhuǎn)向MongoDB這種內(nèi)存數(shù)據(jù)庫的過程,磁盤IO不再是瓶頸。總體來說,還是用內(nèi)存做一級(jí)緩沖,避免大量小數(shù)據(jù)塊讀寫的方案。
針對(duì)網(wǎng)游的這些特點(diǎn),golang的語言特性十分適合開發(fā)游戲服務(wù)器端。
首先,go語言提供goroutine機(jī)制作為原生的并發(fā)機(jī)制。每個(gè)goroutine所需的內(nèi)存很少,實(shí)際應(yīng)用中可以啟動(dòng)大量的goroutine對(duì)并發(fā)連接進(jìn)行響應(yīng)。goroutine與gevent中的greenlet很相像,遇到IO阻塞的時(shí)候,調(diào)度器就會(huì)自動(dòng)切換到另一個(gè)goroutine執(zhí)行,保證CPU不會(huì)因?yàn)镮O而發(fā)生等待。而goroutine與gevent相比,沒有了python底層的GIL限制,就不需要利用多進(jìn)程來榨取多核機(jī)器的性能了。通過設(shè)置最大線程數(shù),可以控制go所啟動(dòng)的線程,每個(gè)線程執(zhí)行一個(gè)goroutine,讓CPU滿負(fù)載運(yùn)行。
同時(shí),go語言為goroutine提供了獨(dú)到的通信機(jī)制channel。channel發(fā)生讀寫的時(shí)候,也會(huì)掛起當(dāng)前操作channel的goroutine,是一種同步阻塞通信。這樣既達(dá)到了通信的目的,又實(shí)現(xiàn)同步,用CSP模型的觀點(diǎn)看,并發(fā)模型就是通過一組進(jìn)程和進(jìn)程間的事件觸發(fā)解決任務(wù)的。雖然說,主流的編程語言之間,只要是圖靈完備的,他們就都能實(shí)現(xiàn)相同的功能。但go語言提供的這種協(xié)程間通信機(jī)制,十分優(yōu)雅地揭示了協(xié)程通信的本質(zhì),避免了以往鎖的顯式使用帶給程序員的心理負(fù)擔(dān),確是一大優(yōu)勢。進(jìn)行網(wǎng)游開發(fā)的程序員,可以將游戲邏輯按照單線程阻塞式的寫,不需要額外考慮線程調(diào)度的問題,以及線程間數(shù)據(jù)依賴的問題。因?yàn)?,線程間的channel通信,已經(jīng)表達(dá)了線程間的數(shù)據(jù)依賴關(guān)系了,而go的調(diào)度器會(huì)給予妥善的處理。
另外,go語言提供的gc機(jī)制,以及對(duì)指針的保護(hù)式使用,可以大大減輕程序員的開發(fā)壓力,提高開發(fā)效率。
展望未來,我期待go語言社區(qū)能夠提供更多的goroutine間的隔離機(jī)制。個(gè)人十分推崇erlang社區(qū)的脆崩哲學(xué),推動(dòng)應(yīng)用發(fā)生預(yù)期外行為時(shí),盡早崩潰,再fork出新進(jìn)程處理新的請(qǐng)求。對(duì)于協(xié)程機(jī)制,需要由程序員保證執(zhí)行的函數(shù)不會(huì)發(fā)生死循環(huán),導(dǎo)致線程卡死。如果能夠定制goroutine所執(zhí)行函數(shù)的最大CPU執(zhí)行時(shí)間,及所能使用的最大內(nèi)存空間,對(duì)于提升系統(tǒng)的魯棒性,大有裨益。