Go Modules 基础使用 #

快速开始 #

创建新项目 #

bash
# 1. 创建项目目录(任意位置)
mkdir myproject
cd myproject

# 2. 初始化模块
go mod init myproject

# 输出:
# go: creating new go.mod: module myproject

# 3. 查看生成的文件
cat go.mod

生成的 go.mod 文件:

go
module myproject

go 1.21

模块命名规范 #

bash
# 个人项目
go mod init github.com/username/project

# 组织项目
go mod init github.com/company/project

# 简单项目(本地开发)
go mod init myproject

# 私有仓库
go mod init gitlab.company.com/team/project

第一个示例 #

创建主程序 #

bash
# 创建 main.go
cat > main.go << 'EOF'
package main

import (
    "fmt"
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()
    r.GET("/", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "Hello, Go Modules!",
        })
    })
    
    fmt.Println("Server starting on :8080")
    r.Run(":8080")
}
EOF

自动下载依赖 #

bash
# 方式一:运行时自动下载
go run main.go

# 方式二:手动下载
go mod tidy
go mod download

# 方式三:构建时自动处理
go build

查看依赖变化 #

bash
# go.mod 更新后
cat go.mod
go
module myproject

go 1.21

require github.com/gin-gonic/gin v1.9.1
bash
# go.sum 自动生成
cat go.sum
text
github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqFPSHk=
github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL6YRBqCtAI1IJFI4BYmqfvzDv3w==
github.com/go-playground/locales v0.14.1 h1:2WGlxRO+E8f4Ajv3IvP+K7Q7k1zCwP7UO7f0p7gN1Q=
...

go.mod 文件详解 #

基本结构 #

go
module github.com/myuser/myproject  // 模块路径

go 1.21  // Go 版本要求

require (  // 直接依赖
    github.com/gin-gonic/gin v1.9.1
    golang.org/x/text v0.14.0
)

require (  // 间接依赖
    github.com/bytedance/sonic v1.9.1 // indirect
    github.com/gabriel-vasile/mimetype v1.4.2 // indirect
)

replace (  // 模块替换
    github.com/old/pkg => github.com/new/pkg v1.0.0
)

exclude (  // 排除版本
    github.com/problematic/pkg v1.0.0
)

retract (  // 撤回版本
    v1.0.0
    v1.0.1
)

module 指令 #

go
// 模块路径定义
module github.com/myuser/myproject

// 子目录包的导入路径
// myproject/mypackage
import "github.com/myuser/myproject/mypackage"

go 指令 #

go
// 指定 Go 版本
go 1.21

// Go 1.21+ 还会设置兼容性
go 1.21.0  // 精确版本

require 指令 #

go
// 单行格式
require github.com/gin-gonic/gin v1.9.1

// 块格式
require (
    github.com/gin-gonic/gin v1.9.1
    golang.org/x/text v0.14.0
)

// 间接依赖标记
require (
    github.com/bytedance/sonic v1.9.1 // indirect
)

常用命令速查 #

模块初始化 #

bash
# 初始化新模块
go mod init <module-path>

# 示例
go mod init github.com/myuser/myproject
go mod init myproject

依赖管理 #

bash
# 整理依赖(添加缺失的,移除多余的)
go mod tidy

# 下载依赖到缓存
go mod download

# 验证依赖
go mod verify

# 查看依赖
go mod why <package>
go mod why github.com/gin-gonic/gin

依赖查看 #

bash
# 查看所有依赖
go list -m all

# 查看依赖图
go mod graph

# 查看特定模块信息
go list -m -versions github.com/gin-gonic/gin
go list -m -json github.com/gin-gonic/gin

Vendor 模式 #

bash
# 创建 vendor 目录
go mod vendor

# 使用 vendor 构建
go build -mod=vendor

# 使用 vendor 运行
go run -mod=vendor main.go

添加依赖 #

方式一:代码导入 + tidy #

bash
# 1. 在代码中添加 import
import "github.com/gin-gonic/gin"

# 2. 运行 tidy 自动添加
go mod tidy

方式二:使用 go get #

bash
# 添加最新版本
go get github.com/gin-gonic/gin

# 添加指定版本
go get github.com/gin-gonic/gin@v1.9.1

# 添加特定分支/标签
go get github.com/gin-gonic/gin@latest
go get github.com/gin-gonic/gin@main
go get github.com/gin-gonic/gin@v1

# 添加并更新到最新
go get -u github.com/gin-gonic/gin
go get -u=patch github.com/gin-gonic/gin

方式三:手动编辑 go.mod #

go
// 编辑 go.mod
require (
    github.com/gin-gonic/gin v1.9.1
)

// 然后运行
go mod download

更新依赖 #

更新单个依赖 #

bash
# 更新到最新版本
go get github.com/gin-gonic/gin@latest

# 更新到特定版本
go get github.com/gin-gonic/gin@v1.9.1

# 更新补丁版本
go get -u=patch github.com/gin-gonic/gin

更新所有依赖 #

bash
# 更新所有直接依赖
go get -u

# 更新所有依赖(包括间接)
go get -u=patch

# 整理依赖
go mod tidy

查看可更新依赖 #

bash
# 列出所有依赖
go list -u -m all

# 输出示例
github.com/gin-gonic/gin v1.9.0 [v1.9.1]
golang.org/x/text v0.13.0 [v0.14.0]

移除依赖 #

移除未使用的依赖 #

bash
# 自动移除未使用的依赖
go mod tidy

手动移除 #

bash
# 从 go.mod 移除
# 1. 编辑 go.mod,删除对应行
# 2. 运行 tidy
go mod tidy

go.sum 文件 #

文件格式 #

text
# 格式:模块路径 版本 hash类型=hash值
github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqFPSHk=
github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL6YRBqCtAI1IJFI4BYmqfvzDv3w==

hash 类型 #

hash 类型 说明
h1: 模块 zip 文件的 SHA-256 哈希
/go.mod go.mod 文件的哈希

为什么需要 go.sum #

  1. 完整性验证:确保下载的依赖未被篡改
  2. 一致性保证:确保团队成员使用相同的依赖
  3. 安全性:防止中间人攻击

是否提交 go.sum #

必须提交! go.sum 应该纳入版本控制:

bash
# 正确做法
git add go.mod go.sum
git commit -m "update dependencies"

项目结构示例 #

单模块项目 #

text
myproject/
├── go.mod
├── go.sum
├── main.go
├── cmd/
│   └── cli/
│       └── main.go
├── pkg/
│   ├── utils/
│   │   └── utils.go
│   └── api/
│       └── api.go
├── internal/
│   └── config/
│       └── config.go
└── vendor/        # 可选
    └── ...

导入内部包 #

go
// main.go
package main

import (
    "myproject/pkg/utils"
    "myproject/internal/config"
)

func main() {
    utils.DoSomething()
    config.Load()
}

环境变量配置 #

常用环境变量 #

bash
# 查看所有环境变量
go env

# 查看特定变量
go env GOPROXY
go env GOMODCACHE
go env GOPRIVATE

GOPROXY - 代理设置 #

bash
# 设置代理
go env -w GOPROXY=https://goproxy.cn,direct

# 多代理配置
go env -w GOPROXY=https://goproxy.cn,https://proxy.golang.org,direct

# 直接连接(不使用代理)
go env -w GOPROXY=direct

# 默认值
go env -w GOPROXY=https://proxy.golang.org,direct

GOPRIVATE - 私有模块 #

bash
# 设置私有模块(不走代理)
go env -w GOPRIVATE=github.com/mycompany/*,gitlab.company.com/*

# 同时设置 GONOSUMDB
go env -w GONOSUMDB=github.com/mycompany/*

GOMODCACHE - 缓存目录 #

bash
# 查看缓存位置
go env GOMODCACHE

# 设置缓存位置
go env -w GOMODCACHE=/path/to/cache

# 清理缓存
go clean -modcache

实战练习 #

练习一:创建 Web 服务 #

bash
# 1. 创建项目
mkdir webserver && cd webserver
go mod init webserver

# 2. 创建 main.go
cat > main.go << 'EOF'
package main

import (
    "github.com/gin-gonic/gin"
    "net/http"
)

func main() {
    r := gin.Default()
    
    r.GET("/hello", func(c *gin.Context) {
        c.JSON(http.StatusOK, gin.H{
            "message": "Hello, World!",
        })
    })
    
    r.Run(":8080")
}
EOF

# 3. 下载依赖
go mod tidy

# 4. 运行
go run main.go

练习二:使用第三方库 #

bash
# 1. 创建项目
mkdir cli-tool && cd cli-tool
go mod init cli-tool

# 2. 安装 cobra
go get github.com/spf13/cobra@latest

# 3. 创建 CLI 应用
cat > main.go << 'EOF'
package main

import (
    "fmt"
    "github.com/spf13/cobra"
)

func main() {
    var rootCmd = &cobra.Command{
        Use:   "cli-tool",
        Short: "A simple CLI tool",
        Run: func(cmd *cobra.Command, args []string) {
            fmt.Println("Hello from CLI!")
        },
    }
    
    rootCmd.Execute()
}
EOF

# 4. 运行
go run main.go

练习三:多包项目 #

bash
# 1. 创建项目结构
mkdir -p multipackage/{cmd/server,pkg/mathutil,internal/config}

# 2. 初始化模块
cd multipackage
go mod init multipackage

# 3. 创建包文件
cat > pkg/mathutil/calc.go << 'EOF'
package mathutil

func Add(a, b int) int {
    return a + b
}
EOF

cat > internal/config/config.go << 'EOF'
package config

type Config struct {
    Port int
}

func Default() *Config {
    return &Config{Port: 8080}
}
EOF

cat > cmd/server/main.go << 'EOF'
package main

import (
    "fmt"
    "multipackage/pkg/mathutil"
    "multipackage/internal/config"
)

func main() {
    cfg := config.Default()
    result := mathutil.Add(1, 2)
    fmt.Printf("Server on port %d, result: %d\n", cfg.Port, result)
}
EOF

# 4. 运行
go run cmd/server/main.go

常见问题 #

Q: go: module xxx: no matching versions for query #

bash
# 检查网络连接
# 配置代理
go env -w GOPROXY=https://goproxy.cn,direct

# 检查模块名称是否正确
go get github.com/correct/module@latest

Q: go: cannot find module providing package #

bash
# 运行 tidy 整理依赖
go mod tidy

# 检查 import 路径是否正确

Q: version “latest” invalid #

bash
# 使用 @latest 而不是 latest
go get package@latest

# 或指定具体版本
go get package@v1.0.0

下一步 #

掌握了基础使用后,继续学习:

最后更新:2026-03-28