GO基础总结
Go基础语法参考:https://www.cnblogs.com/vonlinee/p/19005628
环境搭建
# CentOS
yum install go
配置环境变量
# 指定Go的安装根目录
export GOROOT=/usr/local/go
# Go工作区目录(自定义,存放你的项目/依赖包,推荐默认)
export GOPATH=$HOME/go
# Goproxy镜像,解决下载依赖超时/失败,七牛云官方镜像
export GOPROXY=https://goproxy.cn,direct
# 将GO可执行文件加入PATH中,使GO指令与我们编写的GO应用可以全局调用
$PATH=$PATH:$GOBIN:$GOROOT/bin
通过 go version 查看安装的版本
➜ go version
go version go1.23.0 windows/amd64
环境变量
这三个是搭建 Go 开发环境最基本、必须了解的变量。
GOROOT
Go 语言安装的根目录。它指向 Go 的 SDK 所在位置,其中包含标准库、编译器、链接器等所有自带的工具。默认值:通常为 /usr/local/go(Unix-like)或 C:\Go(Windows)。现代版本的 Go 通常能自动设置,一般不需要手动修改。除非你安装了多个 Go 版本并需要切换。
GOPATH
在 Go Modules 出现之前,这是所有 Go 代码的工作目录。它有三个子目录:
- src(源代码)
- pkg(编译后的包文件)
- bin(编译后的可执行文件)。
自 Go 1.11 引入 Modules 后,GOPATH 的重要性已大大降低。但它仍然存在,主要用于存放通过 go install 安装的可执行工具(在 $GOPATH/bin 下)以及缓存旧版本(Go 1.4及之前)的包。默认值:$HOME/go(Unix-like)或 %USERPROFILE%\go(Windows)。
GOBIN
执行 go install 命令编译生成的可执行文件的存放目录。运行 go install 时,生成的可执行文件会放在此目录下。为了能在终端任何地方直接运行这些工具,强烈建议将 $GOBIN 添加到你的系统 PATH 环境变量中。默认值:默认为 $GOPATH/bin 。你可以单独设置它,例如 export GOBIN=$HOME/.local/bin。
命令行工具
go env
会列出所有与 Go 相关的环境变量及其当前值。Windows下输出内容类似于下面这样:
set GO111MODULE=
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\lenovo\AppData\Local\go-build
....
set GOENV=C:\Users\lenovo\AppData\Roaming\go\env
set GOEXE=.exe
set GOEXPERIMENT=
set GOFLAGS=
set GOHOSTARCH=amd64
查看特定的环境变量:go env VARNAME,在 Windows 的 Command Prompt 或 PowerShell 中,用法基本相同。只是变量名的大小写不敏感,但通常保持大写即可。
➜ go env GOPATH # 输出: /Users/username/go
➜ go env GOROOT # 输出: /usr/local/go
➜ go env GOPROXY # 输出: https://goproxy.cn,direct
➜ go env GOPATH GOROOT GOOS GOARCH
C:\Users\lenovo\go
D:\Develop\Go
windows
amd64
使用 -json 标志可以以 JSON 格式输出所有环境变量
go env -json
# 获取特定变量的 JSON 值
go env -json GOROOT GOPROXY
常用环境变量的含义如下
| 变量名 | 含义 | 示例值 |
|---|---|---|
GOPATH |
工作区目录 | /Users/username/go |
GOROOT |
Go 语言安装目录 | /usr/local/go |
GOBIN |
可执行文件安装目录 | $GOPATH/bin |
GOOS |
目标操作系统 | darwin, linux, windows |
GOARCH |
目标架构 | amd64, arm64, 386 |
GOPROXY |
模块代理 | https://goproxy.cn,direct |
GOMODCACHE |
模块缓存目录 | $GOPATH/pkg/mod |
CGO_ENABLED |
是否启用 CGO | 1 (启用) 或 0 (禁用) |
go build
要使用Go编译单个文件,直接在文件上运行 go build <文件名.go> 即可生成可执行文件(默认与源文件名相同),或者使用 go run <文件名.go> 直接编译并运行。若想指定输出文件名,可用 go build -o <输出名> <文件名.go>。
【go build】指令的作用是:在当前目录下编译生成可执行文件。注意,go build指令会调用所有引用包的源码,重新编译,而不是直接使用pkg里的编译后文件,如果在【$GOROOT】与【$GOPATH】下没有找到import引入包的项目源码,就会报错。
go run
go run 命令用于编译并直接运行源代码,它会在后台编译程序(生成临时可执行文件)然后立即执行,执行完毕后删除临时文件,非常适合快速测试和调试,而无需手动生成和管理可执行文件。它的基本语法是 go run [文件名.go] [参数...]。
go install
https://stackoverflow.com/questions/24069664/what-does-go-install-do
主要用于编译和安装可执行文件
格式:go install 包名/包的地址
go install指令的作用是:编译源代码,如果为可执行文件(package "main"且包含main方法),则会编译生成可执行文件到 $GOPATH/bin目录下;源文件中 import 引入的其他包,就会被编译到 $GOPATH/pkg/$GOOS_$GOARCH目录下。
go install / go build
【go install】也可以完成类似【go build】的功能,区别在于【go install】会生成二进制文件到 $GOPATH/pkg/$GOOS_$GOARCH目录下
(这个二进制文件对于我们并没什么意义),但【go install】会把可执行文件自动生成到【$GOBIN】目录下,这是在一开始被配置到
【$PATH】中了,这样就可以使项目可执行文件能被方便的全局调用。
用VSCode打开go代码时,vscode提供的go插件会去执行 go install -v golang.org/x/tools/gopls@latest这个命令,安装@latest版本的gopls这个包,gopls 是 go 官方提供的lsp服务,如果@latest这个版本的gopls和你装的go版本不兼容,则会去下载合适的go版本(估计下的这个版本只是gopls自身用的)
PS C:\Users\lenovo\go> go install -v golang.org/x/tools/gopls@latest
go: downloading golang.org/x/tools v0.41.0
go: downloading golang.org/x/tools/gopls v0.21.0
go: golang.org/x/tools/gopls@v0.21.0 requires go >= 1.25; switching to go1.25.5
go: downloading go1.25.5 (windows/amd64)
......
go get
参考:https://golang.org/doc/go-get-install-deprecation
使用 go get获取 Go 语言的包,go get主要下载依赖,go install主要用于编译和安装可执行文件.
go get 可以理解为git clone到 $GOPATH/src 目录后进行 go install
下载并安装包: go get <包的导入路径>,例如 go get github.com/gin-gonic/gin。
导入路径就是代码中写的import的内容,例如
import "github.com/gin-gonic/gin"
- 仅下载代码 (不安装):
go get -d <包的导入路径> - 更新包到最新版本:
go get -u <包的导入路径> - 同时下载测试所需的包:
go get -t <包的导入路径> - 下载指定版本的包,只需在包路径后添加 @ 符号和版本号,例如
go get <package_path>@<version>,即可下载该特定版本并更新 go.mod 文件,支持标签 (tag) 或提交哈希。
go get下载的包通常存放在 $GOPATH/pkg/mod目录中(Go Modules模式),如果是可执行文件则放在 $GOPATH/bin目录。具体路径可以通过运行 go env GOPATH命令查看,pkg/mod 缓存了所有依赖项,而 bin 存放编译好的二进制工具.
- 依赖包(Modules):
$GOPATH/pkg/mod,在这个目录下,Go按模块名称和版本号(如 github.com)存放下载的依赖库. - 可执行文件: $GOPATH/bin,使用 go install 或 go get(针对工具)安装的二进制程序会放在这里,并不是所有包都会有二进制程序
以 go get github.com/urfave/cli为例,它被下载到了 $GOPATH/pkg/mod 目录下:
$ go get github.com/urfave/cli
go: downloading github.com/urfave/cli v1.22.17
go: downloading github.com/cpuguy83/go-md2man/v2 v2.0.7
go: downloading github.com/russross/blackfriday/v2 v2.1.0
go: added github.com/cpuguy83/go-md2man/v2 v2.0.7
go: added github.com/russross/blackfriday/v2 v2.1.0
go: added github.com/urfave/cli v1.22.17
root@localhost ~/go/pkg/mod/github.com/urfave
drwxr-xr-x 1 root 197121 0 1月 14 22:58 'cli@v1.22.17'/
可以和Github上指定版本的release对比一下:https://github.com/urfave/cli/releases/tag/v1.22.17 ,发现基本上是一样的,估计就和我们直接通过 github 下载是一样的,下载到本地然后解压而已
go mod
Go 1.11+ 版本用于管理项目依赖的核心工具,替代了之前的 GOPATH 模式,让依赖管理更简洁、项目更独立。Go 项目 必须开启 go mod (Go 1.16 及以上版本 默认开启 ,无需手动配置),如果是旧版本 Go,提前执行开启命令:
export GO111MODULE=on # Linux/Mac 临时开启,永久配置加进.zshrc/.bash_profile
set GO111MODULE=on # Windows cmd/PowerShell
下面来说明通过命令行创建一个项目的步骤
go mod init hello
在当前目录下创建一个 go.mod 文件
> go mod init hello
go: creating new go.mod: module hello
go: to add module requirements and sums:
go mod tidy
$ ll
total 1
-rw-r--r-- 1 lenovo 197121 24 1月 14 22:43 go.mod
创建源码文件 main.go
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
编译并运行:go run main.go
go.mod 文件
项目的「依赖清单」,纯文本文件,在项目根目录,由 go mod init 项目名初始化生成;里面记录了: 项目模块名 、 Go 版本 、 项目需要的所有依赖包 + 对应的版本号
$ cat go.mod
module hello
go 1.23.0
require (
// indirect表示传递依赖
github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/urfave/cli v1.22.17 // indirect
)
go.sum 文件
项目的「依赖校验文件」,纯文本文件,自动生成,无需手动修改;里面记录了: 所有依赖包的版本哈希值(校验和) ;
作用:防篡改、验真伪 → 下次下载依赖时,Go 会对比下载包的哈希值和 go.sum记录的是否一致,一致才会使用,避免依赖包被恶意修改或下载到损坏的包;
go mod tidy会同步增删这个文件的校验记录,和 go.mod的依赖清单一一对应。
特别说明:
- 如果源文件里只import了内置包,没有第三方包,执行
go mod tidy是不会生成 go.sum 文件的 - 执行 go get 时也会更新 go.sum 文件
go mod tidy
自动同步项目的依赖关系,让 go.mod 和 go.sum 文件,与项目中 import 导入的包 保持绝对一致 。这包含两层意思:
1. 清理冗余依赖
2. 补齐缺失依赖
这个命令的执行逻辑就是「双向校验 + 自动修正」,执行时会 全盘扫描你的项目所有.go 源码文件 ,分析所有 import语句,然后执行:
自动下载【缺失】的依赖包
你的代码里 import了某个第三方包 / 自定义包,但 go.mod/go.sum 里没有记录这个依赖、本地也没有缓存 → go mod tidy 会自动从远程仓库(通过你的 GOPROXY配置)下载这个依赖,同时把依赖的 版本信息 、校验信息分别写入 go.mod 和 go.sum 文件,保证项目能正常编译运行。
你从 Git 拉取了一个别人的 Go 项目,执行 go run main.go提示 missing module xxx,执行 go mod tidy即可一键补齐所有缺失依赖。
自动删除【未使用】的冗余依赖
你的 go.mod/go.sum 里记录了某些依赖包,但你的项目源码中没有任何地方 import / 使用这些包 → go mod tidy 会自动把这些「无用依赖」从 go.mod(require 段)和 go.sum 中删除,同时清理本地缓存中对应的无用包。
场景举例:你开发时引入了 github.com/gin-gonic/gin,后来需求变更删掉了相关代码,此时 go.mod还残留这个依赖,执行命令即可一键清理。
依赖包的下载位置
go mod tidy下载的所有依赖包, 不会下载到你的项目目录里 ,而是统一缓存到 系统全局缓存目录 :
- Linux/Mac 系统:
$GOPATH/pkg/mod(默认GOPATH是~/go,完整路径~/go/pkg/mod) - Windows 系统:
%GOPATH%\pkg\mod
优点:所有 Go 项目共享一份依赖缓存,不会重复下载,节省磁盘空间;同一个依赖包同一个版本,本地只会存一份。
依赖包的版本选择
go mod tidy会遵循「 最小可用版本 」原则自动选择依赖版本:
- 优先匹配
go.mod中已声明的版本; - 如果未声明,会自动下载该依赖的 最新稳定版 ;
- 如果项目有版本兼容问题,你可以手动在
go.mod中指定版本,再执行go mod tidy即可生效。
基本语法
参见:https://www.cnblogs.com/vonlinee/p/19005628
包管理
使用import关键字,导入要使用的标准库包或第三方依赖包。
import "a/b/c"
import "fmt"
模块
模块是Go语言管理依赖关系的方式。模块是一组被一起发布、版本控制和分发的包的集合。模块可以直接从版本控制仓库或模块代理服务器下载。
有关模块的一系列教程,请参阅 https://golang.org/doc/tutorial/create-module。
默认情况下,go 命令可能会从 https://proxy.golang.org 下载模块。
它可以使用位于https://sum.golang.org的校验和数据库来验证模块。这两项服务均由谷歌的Go团队运营。
这些服务的隐私政策分别可在https://proxy.golang.org/privacy和https://sum.golang.org/privacy查阅。
go 命令的下载行为可以通过 GOPROXY、GOSUMDB、GOPRIVATE 和其他环境变量进行配置。有关更多信息,请参阅“go help environment”和 https://golang.org/ref/mod#private-module-privacy。
以下 3 种依赖管理方式
GOPATH模式
GOPATH 模式是 Go 语言在 1.11 版本之前唯一的工作模式,已被 Go Modules 取代
GOPATH 模式要求所有的 Go 代码(包括自己的项目和第三方依赖库)都必须放在一个单一的工作区目录下,这个目录就是 GOPATH。
它没有版本的概念,你直接使用代码库的最新代码(默认是 master 分支或默认分支)。
$GOPATH工作目录结构,约定有三个子目录(需要自行创建):
1. src ——存放源代码文件
2. pkg——存放编译后的文件
3. bin ——存放编译后的可执行文件
多个项目最好都在一个 $GOPATH下,即 $GOPATH/src/项目1,$GOPATH/src/项目2
go vendor
go vendor 命令(通常指 go mod vendor 或第三方工具 govendor)是 Go 语言中管理项目依赖的机制,其核心是将项目所需的所有依赖包复制到项目根目录下的 vendor 文件夹中,以实现离线构建、版本锁定和保证构建一致性,其中 go mod vendor 是 Go 1.14+ 推荐的官方方式。
go mod vendor (官方 Go Modules 方式)
- go mod vendor: 创建或更新 vendor 目录,将 go.mod 中声明的依赖及其版本复制到 vendor。
go build -mod=vendor: 使用 vendor 目录中的依赖进行构建。
作用: 确保项目在任何环境都能使用指定版本的依赖,实现可重复构建。
这种模式下:包 github.com/$USER/$REPO会在本地目录 vendor/github.com/$USER/$REPO/目录下进行搜索
PS C:\Users\lenovo> go mod vendor
go: go.mod file not found in current directory or any parent directory; see 'go help modules'
go module
Go Modules 是现代的依赖管理系统,以下变量控制其行为。
GOMODCACHE- 含义:Go Module 的缓存目录。所有下载的依赖包(包括特定版本)都会存储在这里。
- 默认值:
$GOPATH/pkg/mod。 - 用途:你可以通过设置此变量来改变依赖包的缓存位置,例如将其放在更大的硬盘分区上。
GOPROXY- 含义:Go Module 代理服务器的地址。用于加速依赖包的下载和提供稳定的可用性。
- 值:是一个逗号分隔的 URL 列表,也可以是特殊值
direct(直连代码仓库)或off(禁用网络)。 - 推荐设置:
https://goproxy.cn,direct(适用于中国大陆,将goproxy.io或官方proxy.golang.org替换为国内镜像源以大幅提升下载速度)。 - 工作流程:Go 工具会按顺序尝试列表中的代理,直到成功为止。最后的
direct表示如果所有代理都失败,则直接尝试连接版本控制系统(如 GitHub)。
GOSUMDB- 含义:Go Checksum Database 的地址。用于验证下载的依赖包是否未被篡改,确保安全。
- 默认值:
sum.golang.org。 - 注意:访问此数据库可能较慢或不可用。如果你使用了可信的国内代理(如
goproxy.cn),通常会配备自己的校验数据库,通常不需要单独修改。在特殊内网环境下可设置为off来关闭校验(不推荐)。
GOPRIVATE/GONOPROXY/GONOSUMDB- 用于控制哪些私有模块(例如公司内部的 GitLab 仓库)不通过公共代理 (
GOPROXY) 下载,也不进行公共校验和校验 (GOSUMDB)。 - 值:逗号分隔的模块路径前缀 glob 模式列表(如
*.company.com,github.com/yourname/private-repo)。 GOPRIVATE设置了,就自动同时设置了GONOPROXY和GONOSUMDB。- 也可以单独精细控制
GONOPROXY和GONOSUMDB。
- 用于控制哪些私有模块(例如公司内部的 GitLab 仓库)不通过公共代理 (
代理配置
设置 CDN 加速代理,以下是几个速度不错的提供者:
- 七牛:Goproxy 中国 https://goproxy.cn
- 阿里: mirrors.aliyun.com/goproxy/
- 官方: < 全球 CDN 加速 https://goproxy.io/>
- 其他:jfrog 维护 https://gocenter.io
在 Linux 或 macOS 上面,需要运行下面命令(或者,可以把以下命令写到 .bashrc 或 .bash_profile 文件中):
# 启用 Go Modules 功能
go env -w GO111MODULE=on
# 配置 GOPROXY 环境变量,以下三选一
# 1. 七牛 CDN
go env -w GOPROXY=https://goproxy.cn,direct
# 2. 阿里云
go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,direct
# 3. 官方
go env -w GOPROXY=https://goproxy.io,direct
Windows 上配置:
# 启用 Go Modules 功能
$env:GO111MODULE="on"
# 配置 GOPROXY 环境变量,以下三选一
# 1. 七牛 CDN
$env:GOPROXY="https://goproxy.cn,direct"
# 2. 阿里云
$env:GOPROXY="https://mirrors.aliyun.com/goproxy/,direct"
# 3. 官方
$env:GOPROXY="https://goproxy.io,direct"
通过 go env GOPROXY 验证是否设置成功
离线安装
https://stackoverflow.com/questions/69603001/golang-offline-install-third-party-package
只有包的 github 地址
私有模块
如果使用的 Go 版本 >=1.13, 可以通过设置 GOPRIVATE 环境变量来控制哪些私有仓库和依赖 (公司内部仓库) 不通过 proxy 来拉取,直接走本地:
# Go version >= 1.13
go env -w GOPROXY=https://goproxy.cn,direct
# 设置不走 proxy 的私有仓库,多个用逗号相隔
go env -w GOPRIVATE=*.corp.example.com

浙公网安备 33010602011771号