Go入門指南

本文會引導你如何入門學習Go語言,僅從語法層面上來講它並不難學,你大概幾天就可以上手。不過按照慣例,在正式開始之前,我們需要先來了解下它的背景和起源。
背景
Go 語言由三位大佬共同創造,他們分別是
- Ken Thompson,圖靈獎獲得者,Unix 系統創始人,B 語言創始人,C 語言創始人
- Rob Pike,Plan9 操作系統作者之一,UTF-8 發明者之一,Go 語言設計領頭人
- Robert Griesemer,JS V8 引擎研發者,三人之中最年輕
還有一位是 Rob Pike 的妻子 Renee French,她設計了 Go 語言的 Logo,就是一只藍色的土撥鼠。

在某一天,三位工程師在漫長的 C++項目編譯等待過程中感到十分無聊,正是在這個時刻,Rob Pike 腦海中突然閃現出一個新穎的構想:他希望設計一種簡潔、小巧、編譯快速,同時擁有不俗性能的編程語言,這樣他們就不再需要每次編譯時都面臨漫長的等待。經過一番短暫的頭腦風暴,三人於 2007 年 9 月 20 日召開了一個簡短的會議,開始討論和設計這門語言的初步原型,正是從這個時刻起,Go 語言正式誕生了。隨後,這個小團隊吸引了越來越多的志同道合的開發者,最終在 2009 年 11 月 10 日,谷歌公司正式將 Go 語言以 BSD-3-Clause 協議開源,並推出了第一個先行版本,並組建了正式的開發團隊。
提示
值得一提的是,你可能會在其它地方看見有人叫它Golang,包括本站的Github倉庫名也叫Golang-Doc,但它的官方名字其實是一直是Go,早期的時候由於go這個域名被搶注了,所以官網的域名就采用了 golang.org,以至於後面新來的人誤以為它就叫Golang。

再之後,Go團隊經過了三年的設計與研發,於 2012 年 3 月發布了第一個正式版本 Go1.0(這個時候 Go 的工具鏈和運行時都還是 C 語言編寫的,直到 Go1.5 才完成自舉),此後每一年發布兩個小版本更新,一直運營和維護到現在。
三位創始人其實在很早以前就退隱了,在大部分時間裡,團隊領頭人是Russ Cox,他早在 Go 語言未對外發布時就已經參與到了開發工作當中,此後一直管理 Go 團隊長達 12 年,直到 2024 年 8 月卸任,由Austin Clements接手並領導後續的開發工作。、
如果你想深入了解 Go 語言的歷史,前往Go History了解更多內容。
特性
- 語法簡單 Go 語言在自由度和靈活度上做了取舍,以此換來了更好的維護性和平滑的學習曲線。
- 部署友好 Go 靜態編譯後的二進制文件不依賴額外的運行環境,編譯速度也非常快。
- 交叉編譯 Go 僅需要在編譯時簡單設置兩個參數,就可以編譯出能在其它平台上運行的程序
- 天然並發 Go 語言對於並發的支持是純天然的,僅需一個關鍵字,就可以開啟一個異步協程。
- 垃圾回收 Go 有著優秀的 GC 性能,大部分情況下 GC 延時都不會超過 1 毫秒。
- 豐富的標准庫 從字符串處理到源碼 AST 解析,功能強大且豐富的標准庫是 Go 語言堅實的基礎。
- 完善的工具鏈 Go 有著完善的開發工具鏈,涵蓋了編譯,測試,依賴管理,性能分析等方方面面。
Go 語言拋棄了繼承,弱化了 OOP,類,元編程,泛型,Lamda 表達式等這些特性,擁有良好的性能和較低的上手難度,它適合用於雲服務開發,應用服務端開發,以及網絡編程。它自帶 GC,不需要開發者手動管理內存,靜態編譯和交叉編譯這兩點對於運維而言也十分友好。
Go 語言的缺點同樣也有很多,比如令人詬病的錯誤處理,殘缺的泛型,標准庫雖然很豐富但內置的數據結構卻沒幾個,interface{}類型滿天飛,沒有枚舉類型,除此之外,Go 開發團隊非常固執己見,不善於聽取社區意見等等。(相比之下,Rust 在錯誤處理,泛型,依賴管理,枚舉,接口等方面做的要好得多)
總的來說,我們需要辯證的看待一門語言,作為一門工程化的語言,Go 可以很大程度上提高團隊的下限,就算開發人員水平再差也能兜底,很少出現一顆老鼠屎壞了一鍋粥這種情況,同時因為簡單的語法和較低的學習難度,可以讓人很快的上手一個項目。盡管 Go 面世只有十余年不到,但已經有相當多的公司將 Go 作為了首選語言,也能側面說明 Go 正在逐漸流行起來。
順便一提,Go 還是一門完全開源的語言,由社區和谷歌共同維護 Go 語言的發展,官方地址是在谷歌倉庫裡,Github 上有一份同樣的鏡像倉庫,如果有心你也可以參與到語言的設計當中。
官方網站:The Go Programming Language
谷歌開源倉庫:google/go: Google Open Source
Github 倉庫:golang/go: The Go programming language
TIP
筆者曾經給 Go 提過 PR,如果你想了解如何給 Go 貢獻代碼,可以看看我寫的這篇文章:如何向 Go 貢獻代碼。
相信很多人應該都或多或少聽說過Rust,它是一個高性能的通用編程語言,其誕生時間比 Go 早一年,Go1 正式發布的時間是 2012 年,Rust 正式版發布時間為 2015 年,它們都是較為現代化的語言,這兩門語言筆者都很喜歡,它們發展的領域各不相同,如果你不滿足於 Go 的運行效率和表達能力,不妨試試 Rust,不過它的學習難度就遠沒有 Go 這麼簡單了。
安裝
Go 語言下載:Downloads - The Go Programming Language

Stable Version 指的是目前處於維護狀態的兩個穩定版本,Archived Version 指的是不再維護的歷史版本,前往更新日志了解更多關於維護規則以及歷史版本的信息。
windows
對於 windows 平台而言,有 installer 和 archive 兩種類型可選,前者就是安裝包,只需要點點點,推薦使用後者,會讓你更熟悉 go 語言的目錄結構,未來出問題不至於手足無措。選擇下載 zip 文件,壓縮文件中包含 go 語言的源代碼以及工具鏈和一些文檔,將其解壓指定的路徑,然後需要配置兩個系統環境變量。
- GOROOT - go 語言的安裝路徑
- GOPATH - go 語言依賴存放路徑
設置好後,給系統環境變量PATH添加兩條新的項
%GOROOT%\bin:這是 go 二進制程序地址%GOPATH%\bin:這是未來會下載第三方依賴的二進制文件存放地址
在powershell中執行go version命令,最後能正常顯示版本就說明安裝正確。
PS C:\user\username> go version
go version go1.21.3 windows/amd64更新的話只需要下載新的 zip 覆蓋原安裝目錄即可。
linux
拿 ubuntu 舉例,復制想要的版本的鏈接,下載到本地
$ wget https://golang.google.cn/dl/go1.21.1.linux-amd64.tar.gz解壓到指定目錄
$ tar -C ~/go -xzf go1.21.1.linux-amd64.tar.gz在$HOME/.bashrc文件中設置環境變量
export GOROOT=$HOME/go
export GOPATH=$HOME/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin完成後查看安裝版本,確認正確安裝
$ go version
go version go1.21.1 linux/amd64更新的話只需要下載新的 tar.gz 覆蓋原安裝目錄即可。
安裝管理
上面的安裝方式對於基本使用已經夠用了,個人推薦用以下的目錄結構來存放 go 語言及其衍生文件
go/
|
|--root/
| |
| |--go1.21.3/
| |
| |--go1.20.10/
|
|--mod/
| |
| |--bin/
| |
| |--libs/
|
|--cache/
|
|--temp/
|
|--env釋義如下
go/root目錄用於存放各個版本 go 語言源文件go/mod對應GOAPTHgo/mod/libs對應GOMODCACHE,也就是下載的第三方依賴存放地址go/mod/bin對應GOBIN,第三方依賴二進制文件存放地址go/cache,對應GOCACHE,存放緩存文件go/temp,對應GOTMPDIR,存放臨時文件go/env,對應GOENV,全局環境變量配置文件
該方式更新時不需要覆蓋原安裝目錄,只需要將其存放到go/root目錄下,然後修改GOROOT系統環境變量為該目錄下指定版本的文件夾即可。在默認情況下 env 文件是讀取的路徑GOROOT/env,通過設置GOENV系統變量將其與GOROOT分離開,避免了因版本變更時 go 環境變量配置的變化,下面是env文件的初始設置。
GO111MODULE=on
GOCACHE=go/cache
GOMODCACHE=go/mod/libs
GOBIN=go/mod/bin
GOTMPDIR=go/temp這只是筆者比較喜歡的一個目錄風格,前往命令-環境變量了解更多關於環境變量的信息,你可以完全按照個人喜好來進行自定義。
多版本管理
我編寫了一個多版本管理工具govm,結合上面目錄結構使用效果最佳。它可以管理本地多個 Go 版本,可以隨時切換版本,也可以搜索並下載其他 Go 版本並將其安裝到本地。
$ govm search 1.22 -n 10
go1.22.6 76 MB
go1.22.5 76 MB
go1.22.4 76 MB
go1.22.3 76 MB
go1.22.2 76 MB
go1.22.1 76 MB
go1.22.0 76 MB
$ govm install 1.22.4
Fetch go1.22.4 from https://dl.google.com/go/go1.22.4.windows-amd64.zip
Downloading go1.22.4.windows-amd64.zip 100% |████████████████████████████████████████| (76/76 MB, 32 MB/s) [2s]
Extract go1.22.4.windows-amd64.zip to local store
Remove archive from cache
Version go1.22.4 installed
$ govm use 1.22.4
Use go1.22.4 now
# 重新登陸shell
$ go version
go version go1.22.4 windows/amd64如果你想了解如何用 Go 編寫命令行工具,不嫌棄的話可以將 govm 作為一個項目參考,它也是由 Go 編寫的。
編輯器
主流的 go 語言 IDE 目前個人只推薦下面兩個
- goland:jetbrain 出品,功能強大,全方位支持,不過需要付費,可以考慮 IDEA 社區版配合插件
- vscode:無需付費,萬能的編輯器,有插件加持什麼語言都能寫
如果有其它的編輯器更符合自身的使用習慣也都可以用,用什麼編輯器倒無所謂,如果只是寫一些簡短的練習代碼,可以試試官方提供的goplay,可以在線運行 go 代碼。
寄語
Go 語言整體難度並不高,如果你有其他語言基礎學起來會非常簡單,在學習的過程中遇到琢磨不透的難點可以先跳過,學習任何一門語言都是先籠統的了解這個語言的大致語法與結構,再去深究一些特性和細節,文檔中的理念也是如此,適合入門學習。筆者本人也僅僅只是一名普通學生,難免會有疏漏和勘誤,如果有發現任何錯誤可以在 Github 提交 PR,如果覺得文檔還不錯可以在 Github 上點一個 Star。
如果你是強 OOP 語言的開發者,比如 Java,C#等,請不要帶著 OOP 的思想先入為主,否則會對 go 的很多設計感到匪夷所思,在編寫代碼的時候也會非常難受,筆者最開始也是這樣。
概覽
下面對本站的內容進行一個簡單的介紹,以便各位可以按需閱讀,部分頁面是空白的代表著還未更新。
- 語言入門:主要講解關於 Go 語言本身的內容,偏理論。
- 社區生態:主要講解 Go 周邊的生態,偏應用。
前往准備開始進行入門學習

