Skip to content

1.1 环境搭建与工具链 ​

Go 安装与版本管理 ​

macOS 安装 ​

bash
# 使用 Homebrew 安装
brew install go

# 验证安装
go version

# 查看安装位置
which go

Linux 安装 ​

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 ~/.bashrc

Windows 安装 ​

从 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 versions

mise (跨平台,推荐) ​

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.25

asdf (跨平台) ​

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.0

GOPROXY 配置 ​

国内镜像加速 ​

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 GOPROXY

GOPATH 与 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 插件 ​

  1. 安装 VS Code
  2. 安装 Go 插件 (Go Team at Google)
  3. 配置 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 verify

Git 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