? ? 寫(xiě)在面前实抡,雖然Golang已經(jīng)誕生10年阁簸,網(wǎng)絡(luò)上也遍布著相關(guān)的學(xué)習(xí)文章畔柔,但鑒于學(xué)習(xí)從 聽(tīng)->看->寫(xiě)->深入理解->舉一反三 這么一個(gè)的過(guò)程,所以還是督促自己把初步的認(rèn)知整理成文字來(lái)加固自己的一個(gè)記憶和理解捍掺。
言歸正題撼短。
為什么會(huì)選擇Go
? ? 在上一年里,python一直是我喜歡的語(yǔ)言也是數(shù)據(jù)處理中首選的挺勿,包括復(fù)雜的web爬取甚至到數(shù)據(jù)可視化以及機(jī)器學(xué)習(xí)曲横,幾乎它可以做任何事情。但隨著Go的成熟满钟,越來(lái)越多的公司開(kāi)始逐步改善自身架構(gòu)轉(zhuǎn)向Go胜榔,這驅(qū)使我學(xué)習(xí)Go的前提也思考如何將學(xué)習(xí)到的新技能如何應(yīng)用到做工作中胳喷。
Go的優(yōu)勢(shì)
●并發(fā)與協(xié)程goroutine
? ? 總所周知湃番,Go有超強(qiáng)的并發(fā)處理能力其重要原因在于支持協(xié)程并發(fā)(協(xié)程又稱(chēng)微線程,比線程更輕量吭露、開(kāi)銷(xiāo)更小吠撮,性能更高),操作起來(lái)非常簡(jiǎn)單讲竿,語(yǔ)言級(jí)別提供關(guān)鍵字(go)用于啟動(dòng)協(xié)程泥兰,并且在同一臺(tái)機(jī)器上可以啟動(dòng)成千上萬(wàn)個(gè)協(xié)程。這里對(duì)比C#的線程開(kāi)發(fā)和Go的協(xié)程實(shí)現(xiàn)题禀,明顯更直接鞋诗、簡(jiǎn)單。這就是Go的魅力所在迈嘹,以簡(jiǎn)單削彬、高效的方式解決問(wèn)題,關(guān)鍵字go秀仲,或許就是Go語(yǔ)言最重要的標(biāo)志融痛。
(其他無(wú)協(xié)程概念的語(yǔ)言要想完成并發(fā)編程要同時(shí)了解線程、鎖神僵、Semaphore雁刷、CPU緩存方式等等)
●消息通信channel
????在Go語(yǔ)言中,使用基于消息傳遞的通信方式(而不是大多數(shù)語(yǔ)言所使用的基于共享內(nèi)存的通信方式)進(jìn)行協(xié)程間通信保礼,并且將消息管道(channel)作為基本的數(shù)據(jù)類(lèi)型沛励,使用類(lèi)型關(guān)鍵字(chan)進(jìn)行定義责语,其本質(zhì)是一個(gè)先進(jìn)先出的隊(duì)列,使用goroutine+channel進(jìn)行數(shù)據(jù)通訊簡(jiǎn)單高效目派,同時(shí)也線程安全鹦筹,多個(gè)goroutine可同時(shí)修改一個(gè)channel,不需要加鎖址貌。
●高性能HTTPServer
? ??作為服務(wù)端語(yǔ)言铐拐,Go在語(yǔ)言級(jí)別自帶HTTP/TCP/UDP高性能服務(wù)器,基于協(xié)程并發(fā)练对,為業(yè)務(wù)開(kāi)發(fā)提供最直接有效的能力支持遍蟋。
●格式化代碼Gofmt
? ? 作為很多有強(qiáng)迫癥的人看到別人的代碼都并未排版甚至太多的換行左 { 不一致的問(wèn)題出現(xiàn)一定非常捉狂,但是Go 編譯器始終盡力保持代碼的清潔螟凭,將未使用的變量視為編譯錯(cuò)誤虚青。而且,Go 采用了獨(dú)特的方法讓計(jì)算機(jī)能處理大多數(shù)格式問(wèn)題螺男。在保存或編譯時(shí) Go 會(huì)運(yùn)行 Gofmt 的程序棒厘,它會(huì)處理大多數(shù)的格式問(wèn)題。
(如果不關(guān)心其中的一個(gè)變量下隧,只需使用 _(下劃線)并將其分配給空標(biāo)識(shí)符即可)
總結(jié)語(yǔ)
? ? Go主要是基于兩方面的考慮
????1奢人、執(zhí)行性能?
????縮短API的響應(yīng)時(shí)長(zhǎng),解決批量請(qǐng)求訪問(wèn)超時(shí)的問(wèn)題淆院。在業(yè)務(wù)場(chǎng)景下何乎,一次API批量請(qǐng)求,往往會(huì)涉及對(duì)另外接口服務(wù)的多次調(diào)用土辩,而在之前的實(shí)現(xiàn)模式下支救,要做到并行調(diào)用是非常困難的,串行處理卻不能從根本上提高處理性能拷淘。而Go語(yǔ)言不一樣各墨,通過(guò)協(xié)程可以方便的實(shí)現(xiàn)API的并行處理,達(dá)到處理效率的最大化启涯。 依賴(lài)Go的高性能HTTP Server贬堵,提升系統(tǒng)吞吐能力,由數(shù)百級(jí)別提升到數(shù)千里甚至過(guò)萬(wàn)級(jí)別逝嚎。
? ? 2扁瓢、開(kāi)發(fā)效率?
????Go語(yǔ)言使用起來(lái)簡(jiǎn)單、代碼描述效率高补君、編碼規(guī)范統(tǒng)一引几、上手快。 通過(guò)少量的代碼,即可實(shí)現(xiàn)框架的標(biāo)準(zhǔn)化伟桅,并以統(tǒng)一的規(guī)范快速構(gòu)建API業(yè)務(wù)邏輯敞掘。 能快速的構(gòu)建各種通用組件和公共類(lèi)庫(kù),進(jìn)一步提升開(kāi)發(fā)效率楣铁,實(shí)現(xiàn)特定場(chǎng)景下的功能量產(chǎn)玖雁。
? ? Go何止只有上面的優(yōu)點(diǎn),還有很多諸如編譯快盖腕,垃圾回收機(jī)制赫冬,強(qiáng)大標(biāo)準(zhǔn)庫(kù)和穩(wěn)定性;只是缺點(diǎn)也會(huì)存在的溃列,但是如果要寫(xiě)一個(gè) API或者完成某個(gè)需要大量磁盤(pán) / 網(wǎng)絡(luò)調(diào)用的任務(wù)劲厌,Go依然是現(xiàn)在的首選。
“世界上只有兩種語(yǔ)言:人們抱怨的語(yǔ)言和沒(méi)人使用的語(yǔ)言听隐〔贡牵”??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? —— ?Bjarne Stroustrup