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í)技巧和步驟
- 了解 Go 的一些基本情況后,接下來我們看看怎么學(xué)習(xí) Go鲫骗。學(xué)習(xí) Go 首先犬耻,要把 Go 的基本語法弄清楚,這個(gè)可以看一些入門的書籍执泰,把 Go 的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)有個(gè)大致了解枕磁。
- 通讀 Go 的一些好的文章如 Frequently Asked Questions (FAQ)或者看看 FAQ 的中文翻譯 ,主要是了解 Golang 的全貌术吝。
- Go 精華文章列表计济。
- Go 相關(guān)博客列表。
- Go Talks排苍。
- 關(guān)注 Go 語言的編碼規(guī)范沦寂,任何一門語言,一定要注重它既有的編碼規(guī)范和慣用法淘衙。首先需要了解 Go 官方的編碼規(guī)范凑队,主要是要參考官方的 CodeReviewComments 和 Effective Go 這兩篇官方文章,真的非常推薦必須要好好的看完、看懂這兩篇文章(英文不好的同學(xué)可以看中文翻譯文檔)漩氨,然后按照官方編碼規(guī)范來具體 coding西壮。規(guī)范的目的主要是能夠在具體的編碼中有跡可循, 一般的大公司叫惊,都會(huì)有內(nèi)部的編碼規(guī)范款青,內(nèi)部的 Go 編碼規(guī)范也是再官方的基礎(chǔ)上做一些優(yōu)化或者定制。
-
有了基本語法霍狰,有了編碼規(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ì)思想
最后就是要?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 編程思維的來源。
-
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)控制(如 殺死)
-
需要有面向?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)行組合
-
理解 Go 語言的一些獨(dú)有特性和慣用法:
- 按照官方和內(nèi)部的編碼規(guī)范來使用媒峡,熟悉它的各種慣用法
- 強(qiáng)類型瘟栖,語法上要注意處理
- 一定要關(guān)注 GC,實(shí)際中要觀察 GC 日志并做好分析
- Go 是有 Runtime 的谅阿,所以得了解 Runtime 的原理和運(yùn)行機(jī)制
-
理解 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ī)制)
- 價(jià)值觀 1:盡可能的簡(jiǎn)單
-
從 Golang 社區(qū)的一些最佳實(shí)踐來看,Golang 的各種組件也需要盡可能的精簡(jiǎn)冠摄。
- Golang 中用好的一些開源組件庫糯崎,都是比較輕量級(jí)的,然后可以各自隨意組合來達(dá)到最佳實(shí)踐河泳。
- 我們自己進(jìn)行組件封裝沃呢、模塊封裝的時(shí)候,也是保持這個(gè)原則拆挥,盡可能的精簡(jiǎn)薄霜,然后使用方進(jìn)行組合。