寫給 Go 初學(xué)者的指北

在云計(jì)算時(shí)代凌那,Go 是首選的編程語言阻问,很多云的基礎(chǔ)設(shè)施都是由 Go 來寫的拭抬,更別說還有 Docker 和 kubernetes 這樣的大殺器部默。對(duì)于后端工程師來說,這是最值得學(xué)習(xí)的技能造虎。

這篇文章適合有一定基礎(chǔ)的人傅蹂,因?yàn)?Go 不適合編程初學(xué)者,對(duì)于編程的初學(xué)者還是建議從 Python 這種語言開始。

如果有一定的編程基礎(chǔ)份蝴,再來學(xué)習(xí) go 就會(huì)輕松不少犁功,特別是有 C 語言基礎(chǔ),學(xué)習(xí) Go 語言就會(huì)快很多婚夫。

Go 的語法很少浸卦,關(guān)鍵詞也很簡潔,但是對(duì)于長期寫 Java 這種面向?qū)ο笳Z言的人來說案糙,需要拋棄 Java 中對(duì)于面向?qū)ο蟮墓逃邢敕ㄏ尴樱珿o 在面向?qū)ο缶幊躺辖o出了不一樣的方案,沒有類的概念时捌,接口與 Java 中的也完全不一樣怒医。對(duì)于熟悉了 Java 的人來說,需要適應(yīng)一段時(shí)間奢讨。

這篇文章不會(huì)涉及 Go 的具體教程稚叹,可以認(rèn)為這是一份路徑圖,是我認(rèn)為快速上手 Go 語言比較好的方式禽笑。

在看下面的內(nèi)容之前入录,我會(huì)默認(rèn)你已經(jīng)掌握了一門開發(fā)語言,并且做過一些 Web 開發(fā)佳镜,熟悉 Git 的基本用法僚稿。

1. 入門

1.1 基礎(chǔ)入門

環(huán)境配置

寫代碼之前,需要先安裝 Go蟀伸,Go 支持 Linux蚀同、macOS、Windows 等平臺(tái)啊掏,可以在這里下載安裝包蠢络。

macOS 和 Windows 都提供了二進(jìn)制安裝包,Linux 則需要使用源碼安裝(在 Ubuntu迟蜜,centos 這些發(fā)行版上也可以通過命令直接安裝刹孔,但一般無法安裝最新版本的 Go)。

在寫代碼之前娜睛,需要了解一下 Go 中的兩個(gè)重要概念:GOROOT髓霞、GOPATH。GOROOT 比較好理解畦戒,就是 Go 的安裝目錄方库,可以理解為 Java 中的 JAVA_HOME。

GOPATH 通常會(huì)是 ~/go 目錄障斋,在這個(gè)目錄底下纵潦,通常有三個(gè)子目錄:bin徐鹤、pkg、src邀层。bin 目錄放的是可執(zhí)行命令返敬,pkg 目錄下是編譯時(shí)生成的一些中間件文件,src 則是存放源碼的地方被济。

在 Go Modules(下面會(huì)說到)出現(xiàn)之前救赐,Go 的依賴庫和源碼都需要放在 GOPATH 的 src,否則會(huì)出現(xiàn)找不到依賴的情況只磷。Go Modules 出現(xiàn)之后经磅,Go 的依賴管理問題基本解決了大半,就不用把源碼放在 GOPATH 中钮追,GOPATH 基本只用來存放依賴预厌。

基礎(chǔ)語法

Go 的官網(wǎng)提供了一個(gè)入門的教程 A Tour of Go,這里面基本覆蓋到了 Go 的全部語法元媚≡矗可以直接在網(wǎng)頁上訪問,也可以把這個(gè)應(yīng)用下載到本地:

go get golang.org/x/tour

然后就可以在命令行輸入(需要配置 GOPATH ):

tour

這樣就可以打開一個(gè)本地的網(wǎng)頁刊棕,加載的速度就會(huì)快很多炭晒,畢竟 Go 的官網(wǎng)在境外,直接訪問的還是有點(diǎn)慢甥角。

類似的教程還有一個(gè) Go By Example网严,這兩個(gè)教程可以選擇一個(gè)學(xué)習(xí)。

在把上面的練習(xí)做完了之后嗤无,就可以開始看 《Go 程序設(shè)計(jì)語言》震束,這本書可以說是 Go 最好的入門教材,雖然在內(nèi)容上有一定的滯后当犯,但整體上依然非常值得看垢村。

常用命令工具

Go 命令(go cli command)非常重要,Go 整個(gè)開發(fā)的生命周期都需要使用這些工具嚎卫。

Go 命令的基本用法如下:

go <command> [arguments]

在 初學(xué)階段嘉栓,下面幾個(gè)命令必須掌握:

  • go run:編譯并運(yùn)行 Go 程序
  • go build:編譯并打包 Go 程序
  • go get:安裝依賴
  • go test:運(yùn)行測試

在你開始使用 Go 開發(fā)程序之后,會(huì)頻繁的用到上面的命令拓诸。如果要查看完整的命令胸懈,在命令行輸入:

go help

這些內(nèi)容都看完之后,對(duì)于 go 基本語法和常用工具應(yīng)該是比較熟練了恰响,為了能夠盡快使用上手 Go 的開發(fā),接下來應(yīng)該要學(xué)習(xí)一些常用的組件和框架涌献。

1.2 常用框架

如果要開發(fā)一個(gè)應(yīng)用胚宦,基本都會(huì)涉及到 Web API 的開發(fā),會(huì)使用 MySQL 和 Redis。下面就介紹一下 Go 語言中如何快速上手這些框架枢劝。

Web 框架

Go 中常用的 web 框架 有很多井联,我推薦 gin,這個(gè)框架簡單易學(xué)您旁,而且性能也很不錯(cuò)烙常。

go get -u github.com/gin-gonic/gin

可以快速創(chuàng)建一個(gè)基于 http 的 API 服務(wù):

**package main

import "github.com/gin-gonic/gin"

func main() {
    r := gin.Default()
    r.GET("/ping", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "pong",
        })
    })
    r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}**

MySQL 框架

在 Go 語言中,database/sql 包中定義了數(shù)據(jù)庫操作的所有接口鹤盒,但沒有提供具體的實(shí)現(xiàn)蚕脏。因?yàn)閿?shù)據(jù)庫的種類很多,這種只定義接口的屏蔽了數(shù)據(jù)庫庫的具體實(shí)現(xiàn)侦锯,便于我們更換和升級(jí)驼鞭。

所以在連接數(shù)據(jù)庫的時(shí)候,需要自行選擇數(shù)據(jù)庫驅(qū)動(dòng)尺碰,推薦那些完全實(shí)現(xiàn)了 database/sql 的驅(qū)動(dòng)挣棕,這樣利于代碼的后續(xù)維護(hù)和升級(jí)。

在這里以 MySQL 數(shù)據(jù)庫為例亲桥,常用的驅(qū)動(dòng)是 go-sql-driver/mysql洛心,這個(gè)驅(qū)動(dòng)完全實(shí)現(xiàn)了 database/sql 接口。

安裝很方便:

$ go get -u github.com/go-sql-driver/mysql

然后就可以使用 database/sql 的接口來操作數(shù)據(jù)庫:

import (
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
)

db, err := sql.Open("mysql", "user:password@/dbname")
if err != nil {
    panic(err)
}

用原生的 MySQL 接口來寫代碼會(huì)產(chǎn)生很多的冗余代碼题篷,如果想讓代碼更加整潔一點(diǎn)词身,ORM 框架就是必須的了,那就需要學(xué)習(xí)一下 gorm 框架悼凑。

go get -u gorm.io/gorm

Redis 框架

在 Go 中使用 Redis 就需要使用 go-redis/redis 組件了偿枕。安裝同樣很簡單:

go get github.com/go-redis/redis/v8

除了這個(gè)組件之外,另一個(gè) redigo 使用的人也挺多的户辫,可以自行探索一下渐夸。

學(xué)完這些,就可以使用 Go 來日常的開發(fā)了渔欢。

2. 進(jìn)階

在學(xué)完上面的基礎(chǔ)之后墓塌,就需要學(xué)習(xí)一些進(jìn)階的內(nèi)容。

Go Modules

在學(xué)習(xí)上面的框架時(shí)奥额,可能你還是在 GOPATH 寫代碼苫幢。從 Go1.11 之后,Go 推出了 Go Modules 作為官方的依賴管理工具垫挨。

這個(gè)工具必須要學(xué)會(huì)韩肝,依賴管理一直是 Go 語言的短板,經(jīng)歷了多個(gè)非官方的解決方案之后九榔,官方出手哀峻,推出了這個(gè)工具涡相。學(xué)習(xí)的最好資料是 Go Blog 上的文章:https://blog.golang.org/using-go-modules。如果英文的看起來不方便剩蟀,這里有我翻譯的版本催蝗。

用了 Go Modules 之后,依賴管理會(huì)方便很多育特,也不用在 GOPATH 下開發(fā)了丙号。

Go Blog

學(xué)習(xí) Go 語言,Go blog 絕對(duì)是很重要的資料缰冤。官方推出的工具和特性,都會(huì)在第一時(shí)間有 blog 發(fā)布锋谐,看這些資料就能明白這些特性和工具的推出背景涮拗,就不會(huì)理解上的偏差三热。

比如你在 Go blog 中可以學(xué)習(xí)到為什么 Go 的聲明語法是這樣的呐能。

Go 語言特性的更新都會(huì)在 Go blog 上說明摆出,所以關(guān)注 Go blog 是跟進(jìn) Go 特性的好機(jī)會(huì)偎漫。畢竟現(xiàn)在 Go 語言還在不斷的發(fā)展象踊,會(huì)有很多特性在不斷的更新棚壁。

Effective go

除了 Go blog 之外史隆,Go 官方還有 Effective go 這份必看文檔泌射。

這份文檔可以看做是 Go 的避坑指南魄幕,其中指出了 Go 語言容易出錯(cuò)的地方纯陨,可以幫助我們寫出更干凈,結(jié)構(gòu)更優(yōu)美的代碼阴颖,文檔不長量愧,非常值得閱讀。

3. 其他資源

如今學(xué)習(xí)編程累颂,Github 是無法忽略的一個(gè)資源庫紊馏。下面的這些 Github 倉庫中有大量的資源可以學(xué)習(xí)朱监。

  • avelino/awesome-go:Go 的輪子庫也在逐漸完善,Github 上的這個(gè)倉庫收集了 Go 的諸多庫沛慢,要造輪子之前团甲,記得先到這里來找一找
  • Alikhll/golang-developer-roadmap:這里還有一份 Go 開發(fā)者的路線圖
  • talkgo/read:這個(gè)倉庫有很多的 Go 的教程躺苦,是中文版的匹厘,但里面的信息需要甄別一下她按,有些已經(jīng)過時(shí)了
  • go/wiki:go 項(xiàng)目的wiki炕柔,這里有很多技術(shù)文檔陵刹,和大牛的博客衰琐,如果后續(xù)想深入研究 Go碘耳,可以從這里下手

4. 開發(fā)工具

GoLand 也是由 JetBrains 出品的工具,這個(gè)工具需要付費(fèi)斗搞。如果不想在這上面花錢,可以使用 VsCode虑啤,VsCode 上的插件很多叉寂,而且安裝方便。

如果自己愿意折騰局服,可以試試 Vim,Vim 配合 vim-go 插件驳遵,體驗(yàn)也還不錯(cuò)淫奔,就是安裝的過程中可能會(huì)踩一些坑。

對(duì)于開發(fā)電腦的選擇堤结,我推薦 Mac搏讶,做開發(fā),Mac 還是非常適合的霍殴,現(xiàn)在互聯(lián)網(wǎng)公司的開發(fā)機(jī)標(biāo)配就是 Mac,如果覺得新的 Mac 的價(jià)格比較貴系吩,可以選擇二手来庭,或者官網(wǎng)的翻新機(jī)。如果不考慮便攜性穿挨,可以選擇 Mac mini月弛,性價(jià)比賊高。

在最近發(fā)布的 Go1.16 版本中科盛,Go 已經(jīng)開始支持 ARM 的架構(gòu)帽衙,所以即使是 M1 芯片的 Mac,也可以用來做 Go 的開發(fā)(但這個(gè)要謹(jǐn)慎贞绵,可能會(huì)有其他的坑)厉萝。

5. 小結(jié)

當(dāng)你把上面的內(nèi)容都過了一遍時(shí),你應(yīng)該和我現(xiàn)在一樣榨崩,算是入門了 Go 語言谴垫,Go 是一門非常有潛力的語言,云計(jì)算時(shí)代的首選母蛛,非常值得學(xué)習(xí)翩剪。

后續(xù)我也會(huì)持續(xù)的更新這篇文章,以及更新這個(gè)系列的文檔彩郊,如果有什么建議前弯,歡迎告訴我。

文 / Rayjun
本文首發(fā)于我的微信公眾號(hào)【Rayjun】

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末秫逝,一起剝皮案震驚了整個(gè)濱河市恕出,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌筷登,老刑警劉巖剃根,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異前方,居然都是意外死亡狈醉,警方通過查閱死者的電腦和手機(jī)廉油,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來苗傅,“玉大人抒线,你說我怎么就攤上這事≡剑” “怎么了嘶炭?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長逊桦。 經(jīng)常有香客問我眨猎,道長,這世上最難降的妖魔是什么强经? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任睡陪,我火速辦了婚禮,結(jié)果婚禮上匿情,老公的妹妹穿的比我還像新娘兰迫。我一直安慰自己,他們只是感情好炬称,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布汁果。 她就那樣靜靜地躺著,像睡著了一般玲躯。 火紅的嫁衣襯著肌膚如雪据德。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天跷车,我揣著相機(jī)與錄音晋控,去河邊找鬼。 笑死姓赤,一個(gè)胖子當(dāng)著我的面吹牛赡译,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播不铆,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼蝌焚,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了誓斥?” 一聲冷哼從身側(cè)響起只洒,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎劳坑,沒想到半個(gè)月后毕谴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年涝开,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了循帐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡舀武,死狀恐怖拄养,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情银舱,我是刑警寧澤瘪匿,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站寻馏,受9級(jí)特大地震影響棋弥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜诚欠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一嘁锯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧聂薪,春花似錦、人聲如沸蝗羊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耀找。三九已至翔悠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間野芒,已是汗流浹背蓄愁。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留狞悲,地道東北人撮抓。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像摇锋,于是被迫代替她去往敵國和親丹拯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

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