介绍
Go 语言的命令行工具(go command)是官方工具, 设计简洁高效, 覆盖开发全生命周期 以下结合 Go 1.25 最佳实践, 按功能分类详解核心命令
笔记中只记录了最常用的命令, 一些不常用的命令可以自己询问AI如何使用
核心原则
- 模块优先: Go 1.16+ 默认启用 Go Modules(无需设置
GO111MODULE=on),GOPATH模式已淘汰 - 命令设计哲学: 每个命令专注单一职责, 组合使用威力强大(如
go test -v -cover) - 帮助随时查: 任何命令后加
-h 或 --help查看详细参数(如go test -h)
1.构建与运行命令
run
将一个文件直接编译并运行(不保留二进制文件)
sh
go run ./main.go
# 输出如下:
Hello, Golang!go
package main
import "fmt"
func main() {
fmt.Println("Hello, Golang!")
}build
生成可执行文件
sh
# 编译并指定输出的文件名
go build ./main.go -o main
# 授予执行权限
chmod +x ./main
# 运行编译后的结果
./maininstall
编译go项目并编译到GOPATH中, 比如可以使用 go 来安装并编译 lazygit
sh
go install github.com/jesseduffield/lazygit@latest2.测试与质量保障命令
test
执行单元测试
sh
go test -v # 详细输出
go test -run TestLogin # 正则匹配测试
go test -cover # 生成覆盖率
go test -bench=. # 运行基准测试
go test -timeout 30s # 设置运行超时时间(防卡死)fmt/vet
- fmt: 手动格式化文件, 通常在用IDE编写代码时触发, 而不需要手动执行
- vet: 检测代码错误(用得少, 因为在编译时会自动检测, 触发不编译运行就强行提交代码)
可用于 CI 流程, 因为有的人编辑器可能并没有设置自动格式化代码, 又或者编辑器设置格式化不符合官方的规范 比如: 有的人喜欢用 4 个空格来代替 tab, 但是 go 语言的规范是: 直接使用 tab 而不是使用4个空格
sh
go fmt .
go vet .3.依赖管理命令
mod
模块管理
sh
go mod init gomod1 # 初始化go模块(名字为 gomod1)
go mod tidy # 自动检测增删依赖, 同步 go.mod 和 go.sum, 推荐做成 githooks, 提交前自动执行
go mod download # 预下载依赖, CI/CD 中加速构建, 仅下载(不会修改 go.mod/go.sum 文件)
go mod verify # 检查已下载模块的校验和是否与 go.sum 一致get
手动安装/升级依赖模块, 会自动同步 go.mod 和 go.sum
sh
# 仅安装依赖模块, 如果已经安装则忽略
go get github.com/sirupsen/logrus
# 升级依赖模块, 没安装则安装, 已经安装则升级到最新版本
go get -u github.com/sirupsen/logruswork
1.18 版本后引入的概念: 多模块工作区 类似 Rust 中 cargo 的 workspace 概念
sh
# 初始化空的工作区
mkdir golang_ws && cd -
go work init
# 初始化模块
mkdir main && cd -
go mod init main
mkdir routes && cd -
go mod init routes
mkdir db && cd -
go mod init db
# 添加新模块到工作区(或者手动编辑 go.work)
go work use ./main
go work use ./routes
go work use ./db
# 添加后查看 go.work
cat go.work
# 输出信息如下:
# go 1.25.5
#
# use (
# ./main
# ./routes
# ./db
# )go
.
├── go.work
├── db
│ ├── go.mod
│ └── main.go
├── main
│ ├── go.mod
│ └── main.go
└── routes
├── go.mod
└── main.gogo
package main
import (
"golang_ws/db"
"golang_ws/routes"
)
func main() {
routes.Init()
db.Connect()
}go
package db
import "fmt"
func Connect() {
fmt.Println("Connect database")
}go
package routes
import "fmt"
func Init() {
fmt.Println("Init routes")
}go
// 其他模块的 go.mod 也是一样, 只是 golang_ws/这个包名不一样
// 按照道理来说, 不应该手动修改这个文件的, 我这里是为了方便做笔记
module golang_ws/main
go 1.25.55.信息查看命令
version
查看 go 编译器版本
sh
go version
# 输出如:
go version go1.25.5 darwin/amd64list
查看当前 go 项目, 所有的依赖模块
sh
go list -m allenv
查看/设置系统环境变量
sh
# 查看系统环境变量
go env
# 设置系统环境变量(不推荐) 建议手动修改 ~/.bashrc
go env -w GOPROXY=https://goproxy.cn,direct实际操作
sh
mkdir golang_proj && cd -
go mod init golang_proj
touch main.go # 创建入口文件go
//main.go
package main
// 直接使用依赖
import (
"github.com/sirupsen/logrus"
)
func main() {
logrus.Info("Info Log")
logrus.Warn("Warn Log")
logrus.Error("Error Log")
}sh
go mod tidysh
go build ./main.go -o main
chmod +x ./main
./main常见错误提示
- go run: 它每次重新编译, 性能低, 且不生成持久化二进制, 只适合临时用来查看代码效果, 不适合部署到服务器上持续运行
- 不要手动编辑
go.sum: 应该由go mod tidy或go get命令自动生成维护 - 编译安装二进制工具(如:lazygit)优先用
go install pkg@version而不是go get,go get是用于管理依赖的 - 模块路径 ≠ 仓库路径:
go.mod中的 module path 是逻辑标识, 可与 Git 路径不同(可通过 replace 指向本地)