1.1 环境搭建与工具链
Go 安装与版本管理
macOS 安装
bash
# 使用 Homebrew 安装
brew install go
# 验证安装
go version
# 查看安装位置
which goLinux 安装
bash
# 下载并安装
wget https://go.dev/dl/go1.25.0.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.25.0.linux-amd64.tar.gz
# 配置环境变量
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
echo 'export GOPATH=$HOME/go' >> ~/.bashrc
source ~/.bashrcWindows 安装
从 https://go.dev/dl/ 下载安装程序,按向导完成安装。
安装后配置系统环境变量:
GOROOT: Go 安装目录 (如C:\Go)GOPATH: 工作目录 (如C:\Users\YourName\go)PATH: 添加%GOROOT%\bin
版本管理工具
goenv (macOS/Linux)
bash
# 使用 goenv (类似 pyenv)
git clone https://github.com/go-nv/goenv.git ~/.goenv
echo 'export GOENV_ROOT="$HOME/.goenv"' >> ~/.bashrc
echo 'export PATH="$GOENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(goenv init -)"' >> ~/.bashrc
source ~/.bashrc
# 安装指定版本
goenv install 1.25.0
goenv install 1.24.0
# 设置全局版本
goenv global 1.25.0
# 设置项目版本
goenv local 1.24.0
# 查看所有已安装版本
goenv versionsmise (跨平台,推荐)
bash
# 安装 mise
curl https://mise.run | sh
# 安装 Go 版本
mise install go@1.25.0
mise use go@1.25.0
# 设置项目版本 (创建 .mise.toml)
mise use go@1.25asdf (跨平台)
bash
# 安装 asdf
git clone https://github.com/asdf-vm/asdf.git ~/.asdf
# 添加 Go 插件
asdf plugin add golang
# 安装并使用
asdf install golang 1.25.0
asdf local golang 1.25.0GOPROXY 配置
国内镜像加速
bash
# 配置 GOPROXY (推荐国内用户)
go env -w GOPROXY=https://goproxy.cn,direct
# 其他镜像源
# https://goproxy.io - 全球加速
# https://mirrors.aliyun.com/goproxy/ - 阿里云
# https://goproxy.cn - 七牛云环境变量管理
bash
# 查看所有环境变量
go env
# 设置环境变量
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
# 恢复默认值
go env -u GOPROXYGOPATH 与 Go Modules
GOPATH (旧模式)
bash
# GOPATH 结构
GOPATH/
├── src/ # 源代码目录
├── pkg/ # 编译后的包
└── bin/ # 可执行文件Go Modules (推荐,Go 1.11+)
bash
# 初始化模块
go mod init <module-name>
# go.mod 文件结构
module example.com/myapp
go 1.25
require (
github.com/gin-gonic/gin v1.9.1
)
# 常用命令
go mod tidy # 整理依赖
go mod download # 下载依赖
go mod vendor # 将依赖复制到 vendor 目录
go mod graph # 查看依赖图
go mod why # 查看为什么需要某个依赖
go mod verify # 验证依赖完整性go.mod 详解
go.mod
module example.com/myapp
go 1.25
require (
// 直接依赖
github.com/gin-gonic/gin v1.9.1
// 间接依赖 (由工具自动添加)
golang.org/x/net v0.8.0 // indirect
)
// 替换依赖 (用于本地调试或私有仓库)
replace github.com/old/pkg => github.com/new/pkg v1.0.0
replace example.com/privaterepo => ../private-repo
// 排除特定版本 (存在安全漏洞)
exclude github.com/example/bad v1.0.0
// 版本回退
retract v1.0.1常用开发工具
VS Code + Go 插件
- 安装 VS Code
- 安装 Go 插件 (Go Team at Google)
- 配置 settings.json:
json
{
"go.formatTool": "goimports",
"go.lintTool": "golangci-lint",
"go.useLanguageServer": true,
"gopls": {
"ui.semanticTokens": true,
"ui.completion.usePlaceholders": true,
"ui.diagnostic.analyses": {
"unusedparams": true,
"shadow": true,
"nilness": true,
"unusedwrite": true,
"useany": true
}
},
"go.buildTags": "",
"go.testFlags": ["-v"],
"go.coverOnSave": false,
"go.coverOnTestPackage": true
}GoLand (JetBrains)
- 开箱即用的 Go IDE
- 内置调试器、测试工具
- 支持代码重构、数据库工具
- 集成 Terminal 和 Git 工具
- 支持远程开发 (SSH, Docker, WSL)
其他编辑器
- Neovim: 搭配 nvim-lspconfig 和 gopls
- Sublime Text: LSP + gopls 插件
- Vim: vim-go 插件
go 命令详解
bash
# 运行 Go 程序
go run main.go
# 编译程序
go build -o app main.go
go build -ldflags="-s -w" -o app # 去掉调试信息,减小体积
# 安装到 GOPATH/bin
go install
# 运行测试
go test ./...
go test -v ./... # 详细输出
go test -race ./... # 竞态检测
go test -cover ./... # 覆盖率
# 格式化代码
go fmt ./...
goimports -w . # 更智能的格式化 (自动添加/删除导入)
# 代码检查
go vet ./...
# 查看包信息
go list -f '{{.Imports}}' ./...
# 生成文档
go doc fmt.Println
go doc -all fmt # 查看所有内容
# 生成性能分析
go test -bench=. -cpuprofile=cpu.out
go test -bench=. -memprofile=mem.out
# 清理缓存
go clean -cache
go clean -modcache # 清理模块缓存编译选项
bash
# 交叉编译
GOOS=linux GOARCH=amd64 go build -o app-linux main.go
GOOS=windows GOARCH=amd64 go build -o app.exe main.go
GOOS=darwin GOARCH=arm64 go build -o app-darwin main.go
# 去掉调试符号 (减小二进制体积)
go build -ldflags="-s -w" -o app
# 嵌入版本信息 (Go 1.18+)
go build -ldflags="-X main.Version=1.0.0 -X main.BuildTime=$(date)"
# 并行编译
export GOMAXPROCS=4代码检查工具
go vet (内置)
bash
# 检查常见错误
go vet ./...
# 检查特定分析器
go vet -printf ./... # 检查 printf 格式
go vet -shadow ./... # 检查变量遮蔽
go vet -unused ./... # 检查未使用的代码staticcheck (推荐)
bash
# 安装
go install honnef.co/go/tools/cmd/staticcheck@latest
# 运行
staticcheck ./...
# 忽略特定规则
staticcheck -checks=all,-ST1000 ./...golangci-lint (集成工具,推荐)
bash
# 安装
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
# 运行
golangci-lint run
# 自动修复
golangci-lint run --fix
# 生成报告
golangci-lint run --out-format=checkstyle > report.xml.golangci.yml 配置
yaml
linters:
enable:
- govet
- errcheck
- staticcheck
- unused
- gosimple
- ineffassign
- typecheck
- gofmt
- goimports
- misspell
- gocyclo
- dupl
- goconst
- gocritic
linters-settings:
gocyclo:
min-complexity: 15
dupl:
threshold: 100
goconst:
min-len: 2
min-occurrences: 2
run:
timeout: 5m
tests: false调试工具 (Delve)
安装与基本使用
bash
# 安装 Delve
go install github.com/go-delve/delve/cmd/dlv@latest
# 启动调试
dlv debug main.go
# 使用 REPL
(dlv) break main # 设置断点
(dlv) break main.go:10 # 按行号设置
(dlv) continue # 继续执行
(dlv) next # 单步
(dlv) step # 步入
(dlv) print variable # 打印变量
(dlv) goroutines # 查看所有 goroutine
(dlv) stack # 查看调用栈
(dlv) quit # 退出VS Code 调试配置
json
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "${fileDirname}",
"env": {},
"args": []
}
]
}项目结构规范
标准布局
project/
├── cmd/ # 可执行应用入口
│ └── myapp/
│ └── main.go
├── internal/ # 私有包 (不可被外部导入)
│ ├── config/
│ ├── handler/
│ └── service/
├── pkg/ # 公共包 (可被外部导入)
│ └── utils/
├── api/ # API 定义 (proto, swagger)
├── configs/ # 配置文件
├── scripts/ # 脚本文件
├── test/ # 测试文件
├── go.mod # 模块定义
├── go.sum # 依赖校验
├── Makefile # 构建脚本
└── README.md # 项目说明Makefile 示例
makefile
.PHONY: build test lint clean run
# 变量
BINARY_NAME=myapp
VERSION?=1.0.0
BUILD_TIME?=$(shell date -u '+%Y-%m-%d_%H:%M:%S')
GIT_COMMIT?=$(shell git rev-parse HEAD)
# 编译
build:
go build -ldflags="-s -w -X main.Version=$(VERSION) -X main.BuildTime=$(BUILD_TIME) -X main.GitCommit=$(GIT_COMMIT)" \
-o $(BINARY_NAME) ./cmd/myapp
# 交叉编译
build-linux:
GOOS=linux GOARCH=amd64 go build -o $(BINARY_NAME)-linux ./cmd/myapp
build-darwin:
GOOS=darwin GOARCH=arm64 go build -o $(BINARY_NAME)-darwin ./cmd/myapp
# 运行
run:
go run ./cmd/myapp/main.go
# 测试
test:
go test -v -race -cover ./...
# 测试覆盖率报告
test-coverage:
go test -v -race -coverprofile=coverage.out ./...
go tool cover -html=coverage.out -o coverage.html
# 代码检查
lint:
golangci-lint run ./...
# 格式化
fmt:
goimports -w .
# 清理
clean:
go clean -cache
rm -f $(BINARY_NAME)*
rm -f coverage.out coverage.html
# 依赖整理
deps:
go mod tidy
go mod verifyGit Hooks 配置
pre-commit 钩子
bash
# 安装 pre-commit
pip install pre-commit
# 创建 .pre-commit-config.yaml.pre-commit-config.yaml
yaml
repos:
- repo: local
hooks:
- id: gofmt
name: gofmt
entry: gofmt -w
language: system
types: [go]
- id: goimports
name: goimports
entry: goimports -w
language: system
types: [go]
- id: golangci-lint
name: golangci-lint
entry: golangci-lint run
language: system
types: [go]
pass_filenames: false手动配置 Git Hooks
bash
# .git/hooks/pre-commit
#!/bin/bash
echo "Running pre-commit hooks..."
# 格式化
FILES=$(git diff --cached --name-only --diff-filter=ACM | grep '\.go$')
if [ -n "$FILES" ]; then
gofmt -w $FILES
goimports -w $FILES
git add $FILES
fi
# 运行测试
go test ./...
if [ $? -ne 0 ]; then
echo "Tests failed!"
exit 1
fi
# 运行 linter
golangci-lint run
if [ $? -ne 0 ]; then
echo "Lint failed!"
exit 1
fi
echo "Pre-commit hooks passed!"
exit 0常用环境配置总结
bash
# ~/.zshrc 或 ~/.bashrc 推荐配置
# Go 路径
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$GOROOT/bin:$GOPATH/bin:$PATH
# Go 代理 (国内用户)
export GOPROXY=https://goproxy.cn,direct
# 禁用 Go 模块 (如果需要 GOPATH 模式)
# export GO111MODULE=off
# 编译优化
export GOMAXPROCS=4
# 其他有用配置
export CGO_ENABLED=1 # 启用 CGO