在云計(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】