1. Go 开发环境搭建与第一个模块化程序

Go 开发环境搭建与第一个模块化程序 学习卡片

Go 工具链安装与版本确认

Go 的安装包自带编译器、链接器、标准库和 go 命令本身。安装完成后,第一件事不是写代码,而是确认工具链可用、版本符合预期,并看清 Go 默认使用的环境变量。

# 1. 确认 go 命令可用及版本
go version
# 预期输出形如:go version go1.22.5 darwin/arm64

# 2. 查看 Go 环境变量(重点看 GOROOT、GOPATH、GOMODCACHE、GO111MODULE)
go env GOROOT GOPATH GOMODCACHE GO111MODULE

# 3. 查看全部环境变量(排查代理、缓存、交叉编译等问题时使用)
go env

关键变量含义:GOROOT 是 Go 安装目录,通常由安装器自动设置,不需要手动改;GOPATH 是工作区目录,默认位于用户主目录下的 go 文件夹,模块模式下它主要存放下载的依赖缓存(GOMODCACHE)和编译产物;GO111MODULE 在 Go 1.16 之后默认为 on,即默认启用模块模式,无需手动开启。

如果 go version 提示找不到命令,说明 Go 的 bin 目录没有加入系统 PATH。Linux/macOS 可在 shell 配置文件中加入 export PATH=$PATH:/usr/local/go/bin,Windows 则在系统环境变量 Path 中追加 Go 安装目录下的 bin。

模块化 Hello World 的目录结构

模块(module)是 Go 依赖管理和版本控制的基本单位,由项目根目录下的 go.mod 文件标识。一个最小可运行的模块化程序包含三部分:模块声明文件、入口源文件、以及由工具链自动生成的依赖锁定文件。

hello-go/
├── go.mod          # 模块声明:模块路径 + Go 版本
├── go.sum          # 依赖校验和(本例无第三方依赖,可能为空或不生成)
└── main.go         # 程序入口,package main + func main

创建步骤:先建目录,再初始化模块,最后写入口文件。

mkdir hello-go
cd hello-go

# 初始化模块,模块路径使用一个可读的标识(本地练习可用任意合法路径)
go mod init example.com/hello-go

# 查看生成的 go.mod
cat go.mod

此时 go.mod 内容形如:

module example.com/hello-go

go 1.22

接着创建 main.go。为了让程序体现“模块化”而非单文件脚本,这里把问候逻辑拆到一个内部包 greet 中,由 main 包调用,从而演示模块内多包的组织方式。

// greet/greet.go
package greet

import "fmt"

// Hello 返回面向 name 的问候语
func Hello(name string) string {
	return fmt.Sprintf("Hello, %s! Welcome to Go modules.", name)
}
// main.go
package main

import (
	"fmt"

	"example.com/hello-go/greet"
)

func main() {
	msg := greet.Hello("Gopher")
	fmt.Println(msg)
}

注意 main.go 的 import 路径 example.com/hello-go/greet 由“模块路径 + 子目录名”拼接而成,这正是模块化导入的核心规则:包路径相对于模块根,而不是相对于文件系统绝对路径。

go build、go run、go mod tidy 工作流

三个命令分工明确:go run 编译并立即执行,适合快速验证;go build 只编译产出可执行文件,适合交付和部署;go mod tidy 根据源码实际导入情况增删 go.mod/go.sum 中的依赖记录,保持依赖声明与代码一致。

# 直接运行,不保留可执行文件
go run .

# 编译生成可执行文件(Windows 下为 hello-go.exe)
go build -o hello-go .
./hello-go

# 整理依赖:删除未使用的依赖,补齐缺失的依赖
go mod tidy

# 查看模块依赖图(本例无第三方依赖,输出较简单)
go list -m all

预期运行输出:

Hello, Gopher! Welcome to Go modules.
常见问题:若 go run . 报 no required module provides package ...,通常是 import 路径写错或模块路径与目录不匹配;若报 go.mod file not found,说明当前目录不在模块根下,需要回到含 go.mod 的目录,或先执行 go mod init。

环境与工作流关系图

Go 工具链 go version / go env GOROOT · GOPATH GOMODCACHE · GO111MODULE 编译器 + 链接器 + 标准库 go build / go run / go mod tidy 模块 hello-go go.mod(模块路径 + Go 版本) main.go(package main) greet/greet.go(内部包) go.sum(依赖校验和) import 路径 = 模块路径 + 子目录 运行结果 go run . → 直接输出 go build -o hello-go . ./hello-go → 可执行文件 Hello, Gopher! Welcome to Go modules. 初始化 编译执行 模块化程序工作流 go mod init 生成 go.mod 编写源码 main.go + greet/ go mod tidy 整理依赖声明 go build / run 编译并验证 编译报错 → 回到源码修正 import 路径或包名 模块路径决定 import 前缀;go.sum 由工具链自动维护,不应手工编辑

验证清单

检查项命令通过标准
工具链可用go version输出 go version go1.x
模块已初始化cat go.mod含 module example.com/hello-go 与 go 1.x
直接运行go run .输出 Hello, Gopher! Welcome to Go modules.
编译产物go build -o hello-go .当前目录生成可执行文件,运行结果与 go run 一致
依赖整洁go mod tidy无报错,go.mod 无多余 require

完成以上验证,说明 Go 工具链、模块初始化、包导入路径和编译运行链路均已打通,可以进入后续的代码格式化与静态检查环节。