Go语言,也被称为Golang,是一种由Google开发的静态类型、编译型编程语言,是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。
Go
是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson
主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。
官方网站:https://go.dev/
中文网站:https://studygolang.com/
Go语言的特点:
Go语言的用途:
win+e打开,右击此电脑,选择属性,搜索查看高级系统设置,点击环境变量
添加变量:
GOROOT
(安装路径):系统变量
下的新建
。GOROOT
,值:C:Program FilesGo(Go 的安装路径
)GOPATH
(项目路径):Go 项目工作目录
GOPATH
,值:D:GoWorkspace。PATH
:Path
,点击编辑
。%GOROOT%in
(Go 的可执行文件路径
)。%GOPATH%in
(GOPATH 的 bin 目录
)。GOROOT
作用GOROOT
是 Go
的安装路径,用于告诉 Go
工具链(如 go build
、go run
)Go 的核心库在哪里。GOROOT
,因此 通常不需要手动添加 GOROOT
环境变量。GOROOT
是 Go
的默认路径(如 C:Program FilesGo
),且未修改过安装路径,无需手动添加 GOROOT。但是,如果 Go 安装到了非默认路径
,或者 Go 工具链出现了找不到标准库的问题,那么可以手动设置 GOROOT。GOPATH
作用GOPATH
是 Go 项目的工作空间目录,用于存储源码、依赖包和生成的二进制文件。Go 1.x
的工作机制(在 Go Modules
之前非常重要),用来组织代码结构。
GOPATH
必要性Go Modules
(现代 Go 的推荐方式),GOPATH
的作用大大降低,但仍有以下场景需要:
GOPATH/bin
到 PATH
go install
安装工具(如 golangci-lint、dlv)时,生成的可执行文件会存放到 GOPATH/bin
下。GOPATH/bin
添加到 Path
中,方便在全局运行这些工具。GOPATH
Go Modules
,可以不显式配置 GOPATH
GOPATH/bin
到 PATH
go install
安装的工具无法直接在命令行中使用。GOROOT
:不需要手动设置(如果使用默认安装路径)。GOPATH
:对于大多数现代项目(使用 Go Modules
),只需设置一个工作目录(如 D:GoWorkspace)作为 GOPATH
。将 GOPATH/bin
添加到系统 PATH,方便全局使用工具。打开新的命令行窗口,运行以下命令:
go env
确保输出的 GOROOT 和 GOPATH 正确。
Go Modules
是 Go
语言推荐的依赖管理方式。
启用 Go Modules:
go env -w GO111MODULE=on
现在的新版本 Go(1.16
及更高版本)默认已经启用了 Go Modules
,因此在一般情况下,不需要手动设置 GO111MODULE
检查是否成功:
go env | findstr GO111MODULE
初始化项目, 在项目目录下运行:
go mod init <模块名称>
例如,创建一个模块名称为 example.com/mymodule 的项目:
go mod init example.com/mymodule
这会生成一个 go.mod 文件,内容类似如下:
module example.com/mymodule
go 1.20
运行项目:
go run .
当在代码中引入第三方包时(例如 github.com/gin-gonic/gin
),Go
会自动解析并下载依赖包。
例如,编写代码:
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()
}
运行:
go mod tidy
这会下载所需的依赖包并更新 go.mod 和 go.sum 文件。
go.mod
记录了直接依赖
,go.sum
记录了依赖的校验信息。
由于网络原因,下载依赖包时可能会很慢,建议更换为国内包源。
设置 Go Modules
使用国内代理:
go env -w GOPROXY=https://goproxy.cn,https://mirrors.aliyun.com,direct
验证配置:
go env | findstr GOPROXY
输出类似:
GOPROXY=https://goproxy.cn,https://mirrors.aliyun.com,direct
如果不想每次都设置,可以直接在系统环境变量中添加 GOPROXY
打开环境变量设置,添加一个新变量:
GOPROXY
https://goproxy.cn,https://mirrors.aliyun.com,direct
GOPROXY
可以配置多个代理地址,并用逗号(,
)分隔。Go
会按照顺序依次尝试这些代理,直到找到一个可用的
这里加 direct
表示如果在指定的代理服务器上找不到模块,Go
会直接尝试从模块源(如 Git 仓库)下载依赖。这是一种后备机制,确保即使代理不可用,依赖仍有机会通过源下载。
go mod tidy
:这会添加缺失的依赖,并移除未使用的依赖。go list -m all
:go get -u <包名>
go get -u github.com/gin-gonic/gin
go.mod
文件,直接指定版本:require github.com/gin-gonic/gin v1.9.0
go mod tidy
如果没有域名,又想避免将来迁移麻烦,可以使用以下方式:
本地开发时使用简单名称:
go mod init myproject
以后需要发布时再修改: 修改 go.mod
文件的 module
字段即可,比如:
module github.com/username/myproject
结合私有模块代理: 如果项目是私有的,可以使用 GOPRIVATE 指定私有模块地址:
go env -w GOPRIVATE=company.com
go.mod
是 Go Modules
的核心文件,用来定义模块及其依赖项。
一个典型的 go.mod 文件可能包含以下内容:
module example.com/mymodule
go 1.20
require (
github.com/gin-gonic/gin v1.9.0
golang.org/x/net v0.5.0
)
各部分含义:
module
: 定义模块的名称(通常是项目的根路径)。模块名称决定了这个项目在其他地方引入时的路径。go
: 指定最低支持的 Go 版本。例如,go 1.20 表示此模块要求 Go 1.20 或更高版本。require
: 列出此模块的直接依赖包及其版本。replace
(可选): 用于替换依赖包的路径或版本,常用于本地开发或依赖修复。replace github.com/example/foo => ../local/foo
exclude
(可选): 指定不允许使用的模块版本。exclude github.com/example/foo v1.2.3
初始化模块:
go mod init
添加依赖:
go get @
自动管理依赖(清理未使用的依赖,并自动添加缺失的依赖):
go mod tidy
go.sum
是 go.mod
的配套文件,用于记录模块依赖的校验信息
,确保依赖的完整性
和一致性
。
作用:
完整性验证
: 在拉取依赖包时,Go 会校验包的实际内容是否与 go.sum
文件中的哈希值一致,防止依赖被篡改。缓存优化
: 记录的校验值使得 Go 工具可以高效地在本地或远程缓存中找到匹配的依赖包。一个典型的 go.sum 文件内容如下:
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...
各部分含义:
<模块名> <版本> <校验值>
:依赖包的完整内容校验值。<模块名> <版本>/go.mod <校验值>
:依赖包的 go.mod
文件校验值。go mod tidy
或使用依赖时,go.sum
会自动更新。go.sum
是由 Go 工具自动维护的,手动修改可能导致校验错误。go mod init
初始化一个新的模块。
会在当前目录下生成 go.mod
文件。
示例:
go mod init example.com/mymodule
go get @
下载指定的依赖包并更新 go.mod
和 go.sum
文件。
@
可选,不指定时默认获取最新版本。
示例:
go get github.com/gin-gonic/[email protected]
如果省略版本:
go get github.com/gin-gonic/gin
会安装最新稳定版。
go mod tidy
自动清理未使用的依赖包,并下载缺失的依赖。
同时更新 go.mod
和 go.sum
文件。
go mod download
下载 go.mod
文件中列出的所有依赖包到本地模块缓存。
go list -m all
列出当前模块的所有依赖及其版本(包括直接和间接依赖)。
go list -u -m all
列出所有依赖,并显示可以更新的版本(如果有)。
在 go.mod
文件中添加 replace
指令,替换依赖的路径或版本。
replace github.com/example/foo => ../local/foo
替换为本地路径版本。
更新依赖后,运行:
go mod tidy
手动删除代码中不需要的依赖后运行:
go mod tidy
这会从 go.mod 中移除未使用的依赖。
go mod verify
验证所有依赖的校验值是否与 go.sum
文件一致,用于检查依赖包是否被篡改。
go env GOMOD
输出当前模块的 go.mod
文件路径。如果没有使用 Go Modules
,输出为空。
go run .
在当前模块中运行主程序文件。
go build
在当前目录下生成可执行文件。
使用 Go Modules
时,会自动管理依赖。
go install
将指定的模块安装到 GOPATH/bin
或配置的 GOBIN
目录下,其的核心功能是 编译并安装 Go 工具或程序
,而不是直接管理依赖
。具体来说:将指定的模块或包编译成可执行文件,并安装到 GOBIN 或 GOPATH/bin 目录下
。
go clean -modcache
清理本地模块缓存(默认存储在 ~/.cache/go-build)。
go get @v1.2.3
强制将依赖包的版本降级或升级到指定版本。
go mod graph
生成依赖关系的图形表示(文本形式)。