Skip to content

介绍

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

# 运行编译后的结果
./main

install

编译go项目并编译到GOPATH中, 比如可以使用 go 来安装并编译 lazygit

sh
go install github.com/jesseduffield/lazygit@latest

2.测试与质量保障命令

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/logrus

work

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.go
go
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.5

5.信息查看命令

version

查看 go 编译器版本

sh
go version

# 输出如:
go version go1.25.5 darwin/amd64

list

查看当前 go 项目, 所有的依赖模块

sh
go list -m all

env

查看/设置系统环境变量

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 tidy
sh
go build ./main.go -o main

chmod +x ./main
./main

常见错误提示

  1. go run: 它每次重新编译, 性能低, 且不生成持久化二进制, 只适合临时用来查看代码效果, 不适合部署到服务器上持续运行
  2. 不要手动编辑 go.sum: 应该由 go mod tidygo get 命令自动生成维护
  3. 编译安装二进制工具(如:lazygit)优先用 go install pkg@version 而不是 go get, go get 是用于管理依赖的
  4. 模块路径 ≠ 仓库路径: go.mod 中的 module path 是逻辑标识, 可与 Git 路径不同(可通过 replace 指向本地)

Released under the MIT License.