Go基礎(chǔ)教程之環(huán)境搭建及常用命令
1 Go
1.1 簡介
1.1.1 定義
Go語言,也被稱為Golang,是一種由Google開發(fā)的靜態(tài)類型、編譯型編程語言,是一個(gè)開源的編程語言,它能讓構(gòu)造簡單、可靠且高效的軟件變得容易。Go
是從2007年末由Robert Griesemer, Rob Pike, Ken Thompson
主持開發(fā),后來還加入了Ian Lance Taylor, Russ Cox等人,并最終于2009年11月開源,在2012年早些時(shí)候發(fā)布了Go 1穩(wěn)定版本。現(xiàn)在Go的開發(fā)已經(jīng)是完全開放的,并且擁有一個(gè)活躍的社區(qū)。
官方網(wǎng)站:https://go.dev/
中文網(wǎng)站:https://studygolang.com/
1.1.2 特點(diǎn)用途
Go語言的特點(diǎn):
- 編譯型語言:
Go語言通過編譯生成機(jī)器碼,因此具有較高的運(yùn)行效率,接近C語言的性能。 - 并發(fā)編程支持:
Go語言內(nèi)置了輕量級的并發(fā)支持,通過goroutine和channel實(shí)現(xiàn)高效的并發(fā)編程。這使得Go語言非常適合開發(fā)高并發(fā)應(yīng)用,如網(wǎng)絡(luò)服務(wù)器、分布式系統(tǒng)等。 - 簡潔的語法:
Go語言的語法簡潔明了,易于學(xué)習(xí)和使用,降低了編程的復(fù)雜性。 - 自動(dòng)垃圾回收:
Go語言具有自動(dòng)垃圾回收機(jī)制,可以有效避免內(nèi)存泄漏問題,減輕了開發(fā)者對內(nèi)存管理的負(fù)擔(dān)。 - 跨平臺支持:
編譯后的Go程序可以在不同操作系統(tǒng)上運(yùn)行,如Windows、Linux、macOS等。 - 標(biāo)準(zhǔn)庫豐富:
Go語言提供了豐富的標(biāo)準(zhǔn)庫,包含了許多實(shí)用的工具和功能,如網(wǎng)絡(luò)編程、文件操作、加密等,方便開發(fā)者快速構(gòu)建軟件系統(tǒng)。 - 工具鏈完善:
Go語言擁有一個(gè)完善的工具鏈,包括代碼格式化工具(gofmt)、性能分析工具(go tool pprof)、測試工具(go test)等,這些工具有助于提高開發(fā)效率和代碼質(zhì)量。
Go語言的用途:
- 服務(wù)器端開發(fā):
Go語言非常適合用于開發(fā)高性能的Web服務(wù)器和API服務(wù)。使用Go語言開發(fā)的Gin和Beego等框架,能夠高效地處理HTTP請求。 - 云計(jì)算:
Go語言是云計(jì)算領(lǐng)域的重要編程語言。許多云服務(wù)、云應(yīng)用程序都是用Go語言開發(fā)的。例如,Google的Kubernetes容器編排系統(tǒng)和Docker容器化平臺都是用Go語言編寫的。 - 大數(shù)據(jù)處理:
Go語言在處理大規(guī)模數(shù)據(jù)時(shí)表現(xiàn)出色。得益于其高效的并發(fā)支持,Go語言能夠顯著提升數(shù)據(jù)處理性能。 - 系統(tǒng)編程:
Go語言也可以用于開發(fā)操作系統(tǒng)、網(wǎng)絡(luò)工具等系統(tǒng)軟件。 - 網(wǎng)絡(luò)編程:
Go語言提供了簡潔而強(qiáng)大的網(wǎng)絡(luò)編程庫,使得開發(fā)網(wǎng)絡(luò)應(yīng)用程序變得簡單和高效。 - 靜態(tài)分析工具:
Go語言的簡潔性和靈活性使其成為開發(fā)靜態(tài)分析工具的理想選擇。 - 命令行工具:
許多高效的命令行工具都是用Go語言編寫的。 - 物聯(lián)網(wǎng)開發(fā):
Go語言具有運(yùn)行效率高、并發(fā)編程支持強(qiáng)等特點(diǎn),非常適合物聯(lián)網(wǎng)開發(fā)。 - 區(qū)塊鏈開發(fā):
Go語言的安全性和高效性使其成為區(qū)塊鏈開發(fā)的首選語言之一。以太坊、Hyperledger Fabric等知名區(qū)塊鏈平臺均使用Go語言作為核心開發(fā)語言。
1.2 環(huán)境配置
1.2.1 下載安裝
訪問國內(nèi)Go語言網(wǎng)站:Go語言中文網(wǎng)
1.2.2 環(huán)境配置
1.2.2.1 添加環(huán)境變量
win+e打開,右擊此電腦,選擇屬性,搜索查看高級系統(tǒng)設(shè)置,點(diǎn)擊環(huán)境變量
添加變量:
- 設(shè)置
GOROOT
(安裝路徑):
點(diǎn)擊系統(tǒng)變量
下的新建
。
名稱:GOROOT
,值:C:\Program Files\Go(Go 的安裝路徑
) - 設(shè)置
GOPATH
(項(xiàng)目路徑):
GOPATH 是Go 項(xiàng)目工作目錄
新建一個(gè)目錄,例如 D:\GoWorkspace。
在系統(tǒng)變量中添加:
名稱:GOPATH
,值:D:\GoWorkspace。 - 添加
PATH
:
找到系統(tǒng)變量中的Path
,點(diǎn)擊編輯
。
添加以下路徑:%GOROOT%\bin
(Go 的可執(zhí)行文件路徑
)。%GOPATH%\bin
(GOPATH 的 bin 目錄
)。
1.2.2.2 各個(gè)環(huán)境變量理解
GOROOT
作用GOROOT
是Go
的安裝路徑,用于告訴Go
工具鏈(如go build
、go run
)Go 的核心庫在哪里。
默認(rèn)情況下,Go 的安裝程序會(huì)自動(dòng)檢測其安裝路徑并設(shè)置好GOROOT
,因此 通常不需要手動(dòng)添加GOROOT
環(huán)境變量。
那么就,是否需要在環(huán)境變量中手動(dòng)添加?如果GOROOT
是Go
的默認(rèn)路徑(如C:\Program Files\Go
),且未修改過安裝路徑,無需手動(dòng)添加 GOROOT。但是,如果 Go 安裝到了非默認(rèn)路徑
,或者 Go 工具鏈出現(xiàn)了找不到標(biāo)準(zhǔn)庫的問題,那么可以手動(dòng)設(shè)置 GOROOT。GOPATH
作用GOPATH
是 Go 項(xiàng)目的工作空間目錄,用于存儲源碼、依賴包和生成的二進(jìn)制文件。
它是Go 1.x
的工作機(jī)制(在Go Modules
之前非常重要),用來組織代碼結(jié)構(gòu)。GOPATH
必要性
如果使用的是Go Modules
(現(xiàn)代 Go 的推薦方式),GOPATH
的作用大大降低,但仍有以下場景需要:- 編譯后的可執(zhí)行文件會(huì)存放在 GOPATH/bin 中。
- 某些工具(如 go install)仍然默認(rèn)依賴 GOPATH。
- 在不使用 Go Modules 的老項(xiàng)目中,GOPATH 是必需的。
- 為什么還要添加
GOPATH/bin
到PATH
當(dāng)用go install
安裝工具(如 golangci-lint、dlv)時(shí),生成的可執(zhí)行文件會(huì)存放到GOPATH/bin
下。
將GOPATH/bin
添加到Path
中,方便在全局運(yùn)行這些工具。 - 是否需要添加
GOPATH
如果項(xiàng)目完全基于Go Modules
,可以不顯式配置GOPATH
如果需要兼容老項(xiàng)目,或安裝工具包,建議配置。 - 是否需要添加
GOPATH/bin
到PATH
必須添加,否則用go install
安裝的工具無法直接在命令行中使用。
- 實(shí)際建議
根據(jù)現(xiàn)代 Go 的實(shí)踐,以下是建議的簡化配置:GOROOT
:不需要手動(dòng)設(shè)置(如果使用默認(rèn)安裝路徑)。GOPATH
:對于大多數(shù)現(xiàn)代項(xiàng)目(使用Go Modules
),只需設(shè)置一個(gè)工作目錄(如 D:\GoWorkspace)作為GOPATH
。將GOPATH/bin
添加到系統(tǒng) PATH,方便全局使用工具。
1.2.3 驗(yàn)證環(huán)境變量
打開新的命令行窗口,運(yùn)行以下命令:
go env
確保輸出的 GOROOT 和 GOPATH 正確。
1.3 包管理工具 Go Modules
1.3.1 開啟使用
Go Modules
是 Go
語言推薦的依賴管理方式。
啟用 Go Modules:
go env -w GO111MODULE=on
現(xiàn)在的新版本 Go(1.16
及更高版本)默認(rèn)已經(jīng)啟用了 Go Modules
,因此在一般情況下,不需要手動(dòng)設(shè)置 GO111MODULE
檢查是否成功:
go env | findstr GO111MODULE
初始化項(xiàng)目, 在項(xiàng)目目錄下運(yùn)行:
go mod init <模塊名稱>
例如,創(chuàng)建一個(gè)模塊名稱為 example.com/mymodule 的項(xiàng)目:
go mod init example.com/mymodule
這會(huì)生成一個(gè) go.mod 文件,內(nèi)容類似如下:
module example.com/mymodule go 1.20
運(yùn)行項(xiàng)目:
go run .
1.3.2 添加依賴包
當(dāng)在代碼中引入第三方包時(shí)(例如 github.com/gin-gonic/gin
),Go
會(huì)自動(dòng)解析并下載依賴包。
例如,編寫代碼:
package main import ( "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.GET("/", func(c *gin.Context) { c.JSON(200, gin.H{"message": "Hello, World!"}) }) r.Run() }
運(yùn)行:
go mod tidy
這會(huì)下載所需的依賴包并更新 go.mod 和 go.sum 文件。go.mod
記錄了直接依賴
,go.sum
記錄了依賴的校驗(yàn)信息。
1.3.3 配置國內(nèi)包源
由于網(wǎng)絡(luò)原因,下載依賴包時(shí)可能會(huì)很慢,建議更換為國內(nèi)包源。
1.3.3.1 通過 go env 配置
設(shè)置 Go Modules
使用國內(nèi)代理:
go env -w GOPROXY=https://goproxy.cn,https://mirrors.aliyun.com,direct
驗(yàn)證配置:
go env | findstr GOPROXY
輸出類似:
GOPROXY=https://goproxy.cn,https://mirrors.aliyun.com,direct
1.3.3.2 修改環(huán)境變量
如果不想每次都設(shè)置,可以直接在系統(tǒng)環(huán)境變量中添加 GOPROXY
打開環(huán)境變量設(shè)置,添加一個(gè)新變量:
- 名稱:
GOPROXY
- 值:
https://goproxy.cn,https://mirrors.aliyun.com,direct
GOPROXY
可以配置多個(gè)代理地址,并用逗號(,
)分隔。Go
會(huì)按照順序依次嘗試這些代理,直到找到一個(gè)可用的
這里加 direct
表示如果在指定的代理服務(wù)器上找不到模塊,Go
會(huì)直接嘗試從模塊源(如 Git 倉庫)下載依賴。這是一種后備機(jī)制,確保即使代理不可用,依賴仍有機(jī)會(huì)通過源下載。
1.3.4 更新和管理依賴
- 下載和清理依賴:
go mod tidy
:這會(huì)添加缺失的依賴,并移除未使用的依賴。 - 查看依賴包:
go list -m all
: - 升級依賴:
go get -u <包名>
例如,升級 Gin:go get -u github.com/gin-gonic/gin
- 指定依賴版本:
編輯go.mod
文件,直接指定版本:require github.com/gin-gonic/gin v1.9.0
然后運(yùn)行:go mod tidy
1.3.5 沒有域名時(shí)項(xiàng)目操作
如果沒有域名,又想避免將來遷移麻煩,可以使用以下方式:
本地開發(fā)時(shí)使用簡單名稱:
go mod init myproject
以后需要發(fā)布時(shí)再修改: 修改 go.mod
文件的 module
字段即可,比如:
module github.com/username/myproject
結(jié)合私有模塊代理: 如果項(xiàng)目是私有的,可以使用 GOPRIVATE 指定私有模塊地址:
go env -w GOPRIVATE=company.com
1.3.6 go.mod
1.3.6.1 文件介紹
go.mod
是 Go Modules
的核心文件,用來定義模塊及其依賴項(xiàng)。
一個(gè)典型的 go.mod 文件可能包含以下內(nèi)容:
module example.com/mymodule go 1.20 require ( github.com/gin-gonic/gin v1.9.0 golang.org/x/net v0.5.0 )
各部分含義:
module
: 定義模塊的名稱(通常是項(xiàng)目的根路徑)。模塊名稱決定了這個(gè)項(xiàng)目在其他地方引入時(shí)的路徑。go
: 指定最低支持的 Go 版本。例如,go 1.20 表示此模塊要求 Go 1.20 或更高版本。require
: 列出此模塊的直接依賴包及其版本。replace
(可選): 用于替換依賴包的路徑或版本,常用于本地開發(fā)或依賴修復(fù)。replace github.com/example/foo => ../local/foo
exclude
(可選): 指定不允許使用的模塊版本。exclude github.com/example/foo v1.2.3
1.3.6.2 操作 go.mod 的常用命令
初始化模塊:
go mod init <module-name>
添加依賴:
go get <package>@<version>
自動(dòng)管理依賴(清理未使用的依賴,并自動(dòng)添加缺失的依賴):
go mod tidy
1.3.7 go.sum
1.3.7.1 文件介紹
go.sum
是 go.mod
的配套文件,用于記錄模塊依賴的校驗(yàn)信息
,確保依賴的完整性
和一致性
。
作用:
完整性驗(yàn)證
: 在拉取依賴包時(shí),Go 會(huì)校驗(yàn)包的實(shí)際內(nèi)容是否與go.sum
文件中的哈希值一致,防止依賴被篡改。緩存優(yōu)化
: 記錄的校驗(yàn)值使得 Go 工具可以高效地在本地或遠(yuǎn)程緩存中找到匹配的依賴包。
一個(gè)典型的 go.sum 文件內(nèi)容如下:
github.com/gin-gonic/gin v1.9.0 h1:4Fq34... github.com/gin-gonic/gin v1.9.0/go.mod h1:kf4B... golang.org/x/net v0.5.0 h1:3jHk... golang.org/x/net v0.5.0/go.mod h1:Lsk4...
各部分含義:
- 每一行記錄一個(gè)依賴包的校驗(yàn)信息。
- 每個(gè)依賴包有兩類記錄:
<模塊名> <版本> <校驗(yàn)值>
:依賴包的完整內(nèi)容校驗(yàn)值。<模塊名> <版本>/go.mod <校驗(yàn)值>
:依賴包的go.mod
文件校驗(yàn)值。
1.3.7.2 管理 go.sum 文件
- 自動(dòng)生成: 當(dāng)運(yùn)行
go mod tidy
或使用依賴時(shí),go.sum
會(huì)自動(dòng)更新。 - 不要手動(dòng)修改:
go.sum
是由 Go 工具自動(dòng)維護(hù)的,手動(dòng)修改可能導(dǎo)致校驗(yàn)錯(cuò)誤。
1.4 常用命令
1.4.1 Go Modules 常用命令
1.4.1.1 模塊初始化
go mod init <module-name>
初始化一個(gè)新的模塊。
會(huì)在當(dāng)前目錄下生成 go.mod
文件。
示例:
go mod init example.com/mymodule
1.4.1.2 添加依賴
go get <package>@<version>
下載指定的依賴包并更新 go.mod
和 go.sum
文件。
@<version>
可選,不指定時(shí)默認(rèn)獲取最新版本。
示例:
go get github.com/gin-gonic/gin@v1.9.0
如果省略版本:
go get github.com/gin-gonic/gin
會(huì)安裝最新穩(wěn)定版。
1.4.1.3 移除未使用的依賴
go mod tidy
自動(dòng)清理未使用的依賴包,并下載缺失的依賴。
同時(shí)更新 go.mod
和 go.sum
文件。
1.4.1.4 下載所有依賴
go mod download
下載 go.mod
文件中列出的所有依賴包到本地模塊緩存。
1.4.1.5 查看依賴列表
go list -m all
列出當(dāng)前模塊的所有依賴及其版本(包括直接和間接依賴)。
1.4.1.6 檢查依賴更新
go list -u -m all
列出所有依賴,并顯示可以更新的版本(如果有)。
1.4.1.7 替換依賴
在 go.mod
文件中添加 replace
指令,替換依賴的路徑或版本。
replace github.com/example/foo => ../local/foo
替換為本地路徑版本。
更新依賴后,運(yùn)行:
go mod tidy
1.4.1.8 移除模塊中的依賴
手動(dòng)刪除代碼中不需要的依賴后運(yùn)行:
go mod tidy
這會(huì)從 go.mod 中移除未使用的依賴。
1.4.1.9 驗(yàn)證依賴
go mod verify
驗(yàn)證所有依賴的校驗(yàn)值是否與 go.sum
文件一致,用于檢查依賴包是否被篡改。
1.4.1.10 查看模塊路徑
go env GOMOD
輸出當(dāng)前模塊的 go.mod
文件路徑。如果沒有使用 Go Modules
,輸出為空。
1.4.2 開發(fā)中的常用命令
1.4.2.1 編譯并運(yùn)行項(xiàng)目
go run .
在當(dāng)前模塊中運(yùn)行主程序文件。
1.4.2.2 構(gòu)建可執(zhí)行文件
go build
在當(dāng)前目錄下生成可執(zhí)行文件。
使用 Go Modules
時(shí),會(huì)自動(dòng)管理依賴。
1.4.2.3 安裝依賴工具
go install <package>
將指定的模塊安裝到 GOPATH/bin
或配置的 GOBIN
目錄下,其的核心功能是 編譯并安裝 Go 工具或程序
,而不是直接管理依賴
。具體來說:將指定的模塊或包編譯成可執(zhí)行文件,并安裝到 GOBIN 或 GOPATH/bin 目錄下
。
1.4.2.4 清理模塊緩存
go clean -modcache
清理本地模塊緩存(默認(rèn)存儲在 ~/.cache/go-build)。
1.4.3 依賴調(diào)試與版本控制
1.4.3.1 強(qiáng)制使用特定版本
go get <package>@v1.2.3
強(qiáng)制將依賴包的版本降級或升級到指定版本。
1.4.3.2 顯示依賴關(guān)系
go mod graph
生成依賴關(guān)系的圖形表示(文本形式)。
總結(jié)
到此這篇關(guān)于Go基礎(chǔ)教程之環(huán)境搭建及常用命令的文章就介紹到這了,更多相關(guān)Go環(huán)境搭建內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go json omitempty如何實(shí)現(xiàn)可選屬性
在Go語言中,使用`omitempty`可以幫助我們在進(jìn)行JSON序列化和反序列化時(shí),忽略結(jié)構(gòu)體中的零值或空值,本文介紹了如何通過將字段類型改為指針類型,并在結(jié)構(gòu)體的JSON標(biāo)簽中添加`omitempty`來實(shí)現(xiàn)這一功能,例如,將float32修改為*float322024-09-09Go+Redis實(shí)現(xiàn)常見限流算法的示例代碼
限流是項(xiàng)目中經(jīng)常需要使用到的一種工具,一般用于限制用戶的請求的頻率,也可以避免瞬間流量過大導(dǎo)致系統(tǒng)崩潰,或者穩(wěn)定消息處理速率。這篇文章主要是使用Go+Redis實(shí)現(xiàn)常見的限流算法,需要的可以參考一下2023-04-04關(guān)于Golang的Map的線程安全問題的解決方案
在?Golang?編程中,map?是一種常用的數(shù)據(jù)結(jié)構(gòu),用于存儲鍵值對,然而,Golang?的?map?在并發(fā)訪問時(shí)是線程不安全的,本文將詳細(xì)介紹?Golang?中?map?的線程不安全性,并提供一些解決方案,幫助開發(fā)者在并發(fā)編程中正確使用?map,需要的朋友可以參考下2024-11-11go單例實(shí)現(xiàn)雙重檢測是否安全的示例代碼
這篇文章主要介紹了go單例實(shí)現(xiàn)雙重檢測是否安全,本文給大家分享雙重檢驗(yàn)示例代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03Go語言實(shí)現(xiàn)定時(shí)器的原理及使用詳解
這篇文章主要為大家詳細(xì)介紹了Go語言實(shí)現(xiàn)定時(shí)器的兩種方法:一次性定時(shí)器(Timer)和周期性定時(shí)器(Ticker),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-12-12golang協(xié)程池模擬實(shí)現(xiàn)群發(fā)郵件功能
這篇文章主要介紹了golang協(xié)程池模擬實(shí)現(xiàn)群發(fā)郵件功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05