Go(又稱 Golang )是 Google 開發的一種靜態強類型、編譯型、並發型,並具有垃圾回收功能的編程語言
Docker 和 Kubernetes 都是使用 Go 進行開發的,這幾年 Go 越來越流行,生態也越來越好了
初學 Go 的時候會遇到了一些小問題,在一些教程中沒有提及或者因為時效性的緣故,經常需要查閱很多資料才能弄懂,所以想寫一篇比較新人視角的文章幫助大家入門
安裝
Go 的官網就是 golang.org,點擊首頁的 Download Go 就可以跳轉到下載頁面,然后下載對應操作系統的 Go,如果國內訪問緩慢,可以訪問鏡像站:golang.google.cn,官方安裝教程:Download and install
Windows 只要下載對應的 msi 文件,然后打開后按照提示基本上就是下一步下一步... 具體可以參考這篇博客:Windows Go 開發環境下載、安裝並配置,安裝完成后 Windows 需要 Win鍵 + R鍵,然后輸入 cmd,輸入 go version,顯示版本號就說明安裝完成
GOPROXY
國內下載依賴庫會比較緩慢,所有我們需要配置 Go Proxy 加速依賴下載(有點像 Java 中修改 Maven 鏡像倉庫),這里鏡像源使用 七牛雲
go env -w GOPROXY=https://goproxy.cn,direct
也可以通過 go env 查看所有的 Go 環境變量,其中就包括 GOPROXY,這個變量定義的就是配置 Go 鏡像
Hello World
推薦使用 JetBrains 家的 GoLand,使用體驗基本和 JetBrains 家的其他軟件例如:IDEA、PyCharm 相似,還有一種也比較主流,就是使用 VSCode 配合 Go 插件,可以參考:VsCode Go插件配置最佳實踐指南,相對來說需要比較多的配置,而且調試比較麻煩,對於新手不是很友好
Go 聖經中也有更詳細的 Hello, World 教程
新建文件 :helloworld.go
package main
import "fmt"
func main() {
fmt.Println("Hello, World")
}
注意 package 必須指定為 main 否則無法運行
靜態編譯 Go 代碼,在代碼對應的目錄打開命令行
go build helloworld.go
這時候當前目錄會生產可執行文件:helloworld
helloworld.exe
# Linux 或者 Mac 下運行的命令是:./helloworld
就可以運行,也可以通過 run 命令,直接編譯+運行
go run helloworld.go
Go Modules
Go modules 是 Go 語言的依賴解決方案,詳細可以查看 官方 Modules Wiki,Go 最早使用的依賴解決方案是:GOPATH,然后使用Go Vendor ,這兩種方案都並不是特別好用,現在還可以搜索到很多舊教程是教你用這兩種管理依賴的,所以讓使初學者很困惑
Go 1.11 正式推出 Go Modules,Go 環境變量中添加了:GO111MODULE(111指的就是版本11.1),用來控制 Go Modules 是否啟用,Go 1.16 開始其默認值設置為 on。GO111MODULE 的值為 off 表示禁用 Go Modules,on 表示啟用,而 auto 表示當項目在 $GOPATH/src 外且項目根目錄有 go.mod 文件時,自動開啟 Go Modules。Go 1.14 時 Go modules 已經很穩定了,並且推薦應用在生產上,所以現在使用 Go,其實可以不考慮這些問題,直接使用 Go Modules 即可,當然如果對這個細節感興趣,可以看這兩篇博客:Go Modules 終極入門、一文搞懂 Go Modules 前世今生及入門使用
Go Modules 提供了一些命令,列舉幾個常用的:
go mod init生成 go.mod 文件,(這個文件有點類似 Maven 的 pom)go mod download下載 go.mod 文件中指明的所有依賴go mod tidy整理現有的依賴
演示一下如何更新依賴,新建一個 hello.go
package main
import (
"fmt"
// 這里引用了一個依賴
"rsc.io/quote"
)
func main() {
// 這里使用了引用依賴的 Hello 方法
fmt.Println(quote.Hello())
}
使用 init 命令創建 go.mod
# 這里的 example.com/hello 是自定義的 module 名稱
go mod init example.com/hello
這個時候如果運行 go build、go install、go run hello.go 都會提示依賴不存在
hello.go:6:2: no required module provides package rsc.io/quote; to add it:
go get rsc.io/quote
我們可以按照提示使用 go get rsc.io/quote,用 go get 來獲取某個具體的依賴
如果有很多依賴的話,go get 就比較麻煩,可以使用 go mod tidy,它會自動添加丟失的依賴、刪除不需要的依賴
在 go mod tidy 后,我們可以運行 go run hello.go,這個時候程序就可以正常運行了
入門
推薦官方的交互式教程 A Tour of Go,網頁就可以敲 Go代碼,也有中文版本:Go 指南,這個教程可以讓你快速上手,想要更細致地學習 Go,推薦 Go語言聖經(中文版)
引用 Go語言聖經 - 入門 中的一句話:
學習一門新語言時,會有一種自然的傾向,按照自己熟悉的語言的套路寫新語言程序。學習Go語言的過程中,請警惕這種想法,盡量別這么做
我們在解決一個問題的時候很容易思維定勢,用已經會的語言的思維思考,推薦視頻教程 神奇代碼在哪里Go實戰,可以看看其他人在寫 Go 的時候是如何思考的
