Go 語言學(xué)習(xí)技巧和編程思維

Go 語言學(xué)習(xí)技巧和編程思維

一、了解 Go 語言

了解 Go 語言背景

學(xué)習(xí) Go 語言敞掘,首先要了解 Go 語言刊侯,Go 是于 2009 年 11 月開源,然后最終在 2012 年上半年的時(shí)候發(fā)布了 Go 1.0 穩(wěn)定版本带膜,主要是由 Google 主導(dǎo)開發(fā)。目前 Go 有一個(gè)非吃眨活躍的社區(qū)膝藕,現(xiàn)在很多互聯(lián)網(wǎng)公司的后端開發(fā)很多都是用 Go 語言開發(fā)了,當(dāng)然了咐扭,這個(gè)目前還動(dòng)搖不了 Java 的統(tǒng)治地位芭挽。

Go 發(fā)展勢(shì)頭這么快,更多的是得益于云原生蝗肪,因?yàn)楫?dāng)前階段云原生已經(jīng)是風(fēng)生水起袜爪,而云原生相關(guān)系統(tǒng)的實(shí)現(xiàn),絕大多數(shù)都是 Go 來實(shí)現(xiàn)的薛闪,比如 K8s辛馆、Istio、Docker豁延、Etcd 等昙篙。

探討 Go 的未來

我們?nèi)タ匆环N語言能不能有一個(gè)好的未來倔韭,主要看如下幾點(diǎn):

  • 社區(qū)是否活躍和豐富、開發(fā)者們是否能夠接收社區(qū)的一些建議瓢对。目前發(fā)展勢(shì)頭較好的語言,比如 Java胰苏、C/C++ 社區(qū)一定是非乘队迹活躍的,參與的人數(shù)會(huì)非常多硕并,并且也能很好的和社區(qū)進(jìn)行交換意見法焰。
  • 是否有一些工業(yè)化的標(biāo)準(zhǔn)。像 C/C++倔毙、Java 這些編程語言都是有標(biāo)準(zhǔn)化組織的埃仪。尤其是 Java,它在架構(gòu)上還搞出了像 J2EE 這樣的企業(yè)級(jí)標(biāo)準(zhǔn)陕赃。
  • 是否有一些重量級(jí)的應(yīng)用項(xiàng)目卵蛉。常見發(fā)展好的語言一定都是有大量的重量級(jí)項(xiàng)目的。
  • 是否有重量級(jí)人物或者公司牽頭么库。
  • 是否容易上手傻丝。

對(duì)比來看,Go 目前的社區(qū)非乘呷澹活躍葡缰,主要由 Google 牽頭,并且能夠很好的接收社區(qū)的意見并且進(jìn)行優(yōu)化改進(jìn)忱反,并且目前很多大公司內(nèi)部也都大量使用 Go泛释,整體語言非常簡(jiǎn)單易懂,并且開發(fā)效率高温算,而 Go 語言的重量級(jí)應(yīng)用比如 Kubernetes 怜校、Istio 、Docker 都是目前火爆的不行的米者。所以韭畸, Go 的未來是非常可觀的蔓搞。但是胰丁,Go 也不至于會(huì)讓其他語言都無處容身,Go 更多的會(huì)在云原生相關(guān)領(lǐng)域喂分,以及 PaaS 層的相關(guān)領(lǐng)域上有絕對(duì)性的優(yōu)勢(shì)锦庸,后續(xù)的一些后端中間的基礎(chǔ)組件可能大多數(shù)都會(huì)使用 Go 來開發(fā)了。

二蒲祈、Go 語言學(xué)習(xí)技巧

了解各語言的優(yōu)缺點(diǎn)

對(duì)技術(shù)人員而言甘萧,學(xué)習(xí)一門新語言萝嘁,必然需要掌握這門語言的一些優(yōu)缺點(diǎn),以及其他類似語言的優(yōu)缺點(diǎn)扬卷,有對(duì)比才能讓你更快的理解這門語言

Go 語言的優(yōu)缺點(diǎn)

  • Go 優(yōu)點(diǎn):學(xué)習(xí)門檻低牙言,非常簡(jiǎn)單直接搓谆,表達(dá)力很強(qiáng)通殃,并且語言特定比較穩(wěn)定,社區(qū)活躍球昨,基本上想要的一些組件或者通用庫徒恋,都能在官方包或者 github 上找到蚕断。不用關(guān)心內(nèi)存分配和釋放,gc 會(huì)幫我們處理入挣。并且還可以兼容 C 亿乳,不過,一般實(shí)際應(yīng)用中很少會(huì)使用兼容 C 的使用姿勢(shì)径筏,要么純 Go葛假、要么純 C。Go 另外一個(gè)比較大的優(yōu)勢(shì)在于支持協(xié)程滋恬,可以非惩┛睿快速的寫出并發(fā)高的代碼,Go 的并發(fā)非常簡(jiǎn)單夷恍。Go 在以前的版本最受大家詬病的泛型魔眨,也在 Go1.18 開始支持了,這個(gè)算的上是他的一個(gè)優(yōu)點(diǎn)了酿雪。

  • Go 缺點(diǎn):目前在兼容 C 的情況下的高并發(fā)的支持上做的還不夠好遏暴。目前 Go 基本只能應(yīng)用在后端開發(fā),無法應(yīng)用在客戶端的開發(fā)指黎,也很少有在 PC 端的開發(fā)朋凉。當(dāng)然,有一些語法和習(xí)慣比較讓人詬病醋安,比如 err 的處理杂彭,但是習(xí)慣了以后,其實(shí)感覺還好吓揪。

C/C++ 語言的優(yōu)缺點(diǎn)

  • C/C++ 的優(yōu)點(diǎn):功能強(qiáng)大亲怠,性能高,C 相對(duì)簡(jiǎn)單點(diǎn)柠辞,C++ 會(huì)比 C 復(fù)雜很多团秽。很多底層的一些實(shí)現(xiàn)都是 C/C++,因?yàn)?C/C++ 更偏向底層,歷史悠久习勤,早些年的大學(xué)學(xué)的大多數(shù)是 C/C++ 語言踪栋,社區(qū)資源豐富。搞 C++ 厲害的都是大神图毕。
  • C/C++ 的缺點(diǎn):指針非常靈活夷都,很多人用不好,相對(duì)來說要用好 C 的話門檻還是比較高予颤,尤其是 C++ 的門檻损肛。另外一方面是需要自己手動(dòng)管理內(nèi)存的申請(qǐng)和分配,一不小心就會(huì)內(nèi)存泄漏或者段指針錯(cuò)誤荣瑟。

Jave 語言的優(yōu)缺點(diǎn)

  • Java 優(yōu)點(diǎn):程序員最多,社區(qū)資源豐富摩泪。內(nèi)存管理基于 GC笆焰,和 Go 一樣,不用自己管理见坑,這大大減少了使用的心智負(fù)擔(dān)嚷掠。基于 VM 字節(jié)碼荞驴,天然提供了跨平臺(tái)的插件機(jī)制不皆。
  • Java 缺點(diǎn):強(qiáng) OO 流派,表達(dá)上有些死板熊楼,不夠活潑(不是靈活)霹娄。

Go 語言學(xué)習(xí)技巧和步驟

  1. 了解 Go 的一些基本情況后,接下來我們看看怎么學(xué)習(xí) Go鲫骗。學(xué)習(xí) Go 首先犬耻,要把 Go 的基本語法弄清楚,這個(gè)可以看一些入門的書籍执泰,把 Go 的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)有個(gè)大致了解枕磁。
  1. 通讀 Go 的一些好的文章如 Frequently Asked Questions (FAQ)或者看看 FAQ 的中文翻譯 ,主要是了解 Golang 的全貌术吝。
  1. 關(guān)注 Go 語言的編碼規(guī)范沦寂,任何一門語言,一定要注重它既有的編碼規(guī)范和慣用法淘衙。首先需要了解 Go 官方的編碼規(guī)范凑队,主要是要參考官方的 CodeReviewCommentsEffective Go 這兩篇官方文章,真的非常推薦必須要好好的看完、看懂這兩篇文章(英文不好的同學(xué)可以看中文翻譯文檔)漩氨,然后按照官方編碼規(guī)范來具體 coding西壮。規(guī)范的目的主要是能夠在具體的編碼中有跡可循, 一般的大公司叫惊,都會(huì)有內(nèi)部的編碼規(guī)范款青,內(nèi)部的 Go 編碼規(guī)范也是再官方的基礎(chǔ)上做一些優(yōu)化或者定制。
  1. 有了基本語法霍狰,有了編碼規(guī)范抡草,那么接下來就需要我們?nèi)⒖紭I(yè)界大牛們的代碼,主要是看一些開源的優(yōu)質(zhì)的項(xiàng)目蔗坯,比如 Google 他們這幫人自己搞的 Kubernetes康震、Istio,還有一些好的項(xiàng)目如 Docker宾濒、CoreDNS腿短、etcd 等等,具體要看這些東西:

    • 項(xiàng)目基本架構(gòu)的組織
    • 代碼基本的編碼封裝
    • 代碼的基本原則規(guī)范
    • 并發(fā)的設(shè)計(jì)思想
    • 面向?qū)ο缶幊痰脑O(shè)計(jì)思想
    • 可擴(kuò)展性的設(shè)計(jì)思想
  2. 最后就是要?jiǎng)邮謱?shí)踐绘梦,實(shí)實(shí)在在的跑一些代碼示例橘忱,一般我的習(xí)慣是自己建立一個(gè) base-code 的項(xiàng)目,里面就是我們的各種 example 示例卸奉,然后進(jìn)行一些修改钝诚、執(zhí)行。具體的代碼示例可以從官方文檔上來榄棵,推薦Go by Example凝颇,里面有大量非常好的例子。也可以自己網(wǎng)上隨便搜下疹鳄,重要的自己要修改并執(zhí)行祈噪,查看和分析結(jié)果,然后再 Go 101這里有各個(gè)語法的使用和介紹

三尚辑、Go 語言價(jià)值觀和編程思維

編程語言會(huì)影響編程思維辑鲤,對(duì)于 Go,最重要的思維就是并發(fā)思維杠茬,因此月褥,學(xué)習(xí) Go,就要用 Go 的編程思維去寫 Go 代碼瓢喉,而不是用其他語言的思維方式【Golang coding in go way】宁赤。

Go 語言的初衷就是為了解決好 Google 內(nèi)部大規(guī)模高并發(fā)服務(wù)的問題,主要核心就是圍繞高并發(fā)來開展栓票;并且同時(shí)又不想引入面向?qū)ο竽欠N很復(fù)雜的繼承關(guān)系决左。所以愕够,這正是 Go 編程思維的來源。

  1. Go 天生就是可以方便的解決好并發(fā)問題(包括高并發(fā))佛猛,那么就需要有并發(fā)思維惑芭,能夠并發(fā)處理就通過并發(fā)來進(jìn)行任務(wù)分配

    • 這里就涉及到了 context、 goroutine继找、channel(select) 等的原理和設(shè)計(jì)遂跟,雖然,在 Go 里面可以創(chuàng)建大量 goroutine婴渡, 但是幻锁,一般我們都需要能通過 context、 channel 建立 "父子"關(guān)系边臼,用來控制其生命周期哄尔,保證子任務(wù)可以能夠被回收、被主動(dòng)控制(如 殺死)
  2. 需要有面向?qū)ο缶幊趟枷肽ⅲ煤?interface岭接、 struct 來實(shí)現(xiàn)繼承、多態(tài)的用法

    • struct 匿名組合來實(shí)現(xiàn)繼承
    • interface 和 struct 來實(shí)現(xiàn)多態(tài)
    • interface 定義接口堂鲤,盡可能的保持里面的方法定義簡(jiǎn)單,然后多個(gè) interface 進(jìn)行組合
  3. 理解 Go 語言的一些獨(dú)有特性和慣用法:

    • 按照官方和內(nèi)部的編碼規(guī)范來使用媒峡,熟悉它的各種慣用法
    • 強(qiáng)類型瘟栖,語法上要注意處理
    • 一定要關(guān)注 GC,實(shí)際中要觀察 GC 日志并做好分析
    • Go 是有 Runtime 的谅阿,所以得了解 Runtime 的原理和運(yùn)行機(jī)制
  1. 理解 Go 語言的價(jià)值觀

    • 價(jià)值觀 1:盡可能的簡(jiǎn)單
      • 語法語義盡可能的簡(jiǎn)單半哟、保持各種類型定義盡可能精簡(jiǎn)
      • 短命名思維,在不影響可讀性的前提下签餐,盡可能的用長度短小的標(biāo)識(shí)符寓涨,一個(gè)例子就是 for i, u := range users {
    • 價(jià)值觀 2:進(jìn)行正交組合,優(yōu)先考慮組合氯檐,而不是常見 OO 語言的繼承方式
      • Go 語言通過類型的垂直組合而不是繼承讓單一類型可以承載更多的功能
      • interface 盡可能的保持職責(zé)單一并且接口里面的方法不要過多
    • 價(jià)值觀 3:大膽使用并發(fā)戒良,Go 是為并發(fā)而生的(Goroutine 機(jī)制)
  2. 從 Golang 社區(qū)的一些最佳實(shí)踐來看,Golang 的各種組件也需要盡可能的精簡(jiǎn)冠摄。

    • Golang 中用好的一些開源組件庫糯崎,都是比較輕量級(jí)的,然后可以各自隨意組合來達(dá)到最佳實(shí)踐河泳。
    • 我們自己進(jìn)行組件封裝沃呢、模塊封裝的時(shí)候,也是保持這個(gè)原則拆挥,盡可能的精簡(jiǎn)薄霜,然后使用方進(jìn)行組合。

參考

Go coding in go way

最后

這篇文章首發(fā)在我微信公眾號(hào)【后端系統(tǒng)和架構(gòu)】中,點(diǎn)擊這里可以去往公眾號(hào)查看原文鏈接惰瓜,如果對(duì)你有幫助否副,歡迎前往關(guān)注,更加方便快捷的接收最新優(yōu)質(zhì)文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鸵熟,一起剝皮案震驚了整個(gè)濱河市副编,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌流强,老刑警劉巖痹届,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異打月,居然都是意外死亡队腐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門奏篙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柴淘,“玉大人,你說我怎么就攤上這事秘通∥希” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵肺稀,是天一觀的道長第股。 經(jīng)常有香客問我,道長话原,這世上最難降的妖魔是什么夕吻? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮繁仁,結(jié)果婚禮上涉馅,老公的妹妹穿的比我還像新娘。我一直安慰自己黄虱,他們只是感情好稚矿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著捻浦,像睡著了一般盐捷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上默勾,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天碉渡,我揣著相機(jī)與錄音,去河邊找鬼母剥。 笑死滞诺,一個(gè)胖子當(dāng)著我的面吹牛形导,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播习霹,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼朵耕,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了淋叶?” 一聲冷哼從身側(cè)響起阎曹,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎煞檩,沒想到半個(gè)月后处嫌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡斟湃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年熏迹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凝赛。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡注暗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出墓猎,到底是詐尸還是另有隱情捆昏,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布毙沾,位于F島的核電站骗卜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏搀军。R本人自食惡果不足惜膨俐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一勇皇、第九天 我趴在偏房一處隱蔽的房頂上張望罩句。 院中可真熱鬧,春花似錦敛摘、人聲如沸门烂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽屯远。三九已至,卻和暖如春捕虽,著一層夾襖步出監(jiān)牢的瞬間慨丐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工泄私, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留房揭,地道東北人备闲。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像捅暴,于是被迫代替她去往敵國和親恬砂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容