第 1 章 · Go 入门与环境搭建
本章目标:理解 Go 编译型、静态类型、自带工具链特点;在 Windows / macOS 上安装 Go 1.22+ 并配置 GOPATH / GO111MODULE;掌握 go mod init 与 VS Code / GoLand 基础;能编写、编译、运行 Hello World;理解 标准项目布局(cmd/、internal/、pkg/);掌握 交叉编译;能用对照表说明 Go 与 java-dev / python-dev 在运行模型、包管理、入口文件上的差异;在虚构练习目录 learn-go 中完成 toolkit-go 入门工程。
学时建议:3~4 小时(含 1 小时跟练与排错)
前置:具备基础电脑操作能力;若已学 java-dev ch01 或 python-dev ch01,可对照安装与运行流程加速理解。
1.1 场景说明:为什么需要 learn-go?
你在 java-dev 中用 learn-java/toolkit-demo 完成了 Maven 与 HelloWorld。团队新项目代号 toolkit-go(通用工具库练习,后续衔接 gin-web、paas ch17)要求使用 Go 1.22+ 开发,以便单二进制部署与高并发 API 场景。本章在独立目录 learn-go 中搭建环境,不与 Java / Python 练习目录混用。
| 维度 | java-dev(learn-java) | python-dev(python-learn) | go-dev(learn-go) |
|---|---|---|---|
| 运行模型 | 编译到字节码 → JVM | 解释型,.py 直接运行 | 编译为原生二进制 |
| 版本管理 | java -version | python --version | go version |
| 包管理 | Maven / pom.xml | pip + venv | go mod / go.mod |
| 入口 | main 方法 | python main.py | func main() + go run |
| 练习项目 | toolkit-demo | hello.py、shop-demo | toolkit-go |
| IDE 推荐 | IDEA Community | VS Code / PyCharm | VS Code + Go 插件 / GoLand |
说明:本章所有路径、模块名、域名均为教学虚构,不涉及任何真实公司仓库、内部配置或生产密钥。模块路径统一为 example.com/toolkit-go。
学习路径(go-dev)
ch01 入门与环境 → ch02 变量与类型 → ch03 流程控制 → ch04 切片与 map
↑ 你在这里
对照学习:java-dev ch01~ch04、python-dev ch01~ch04
后续:ch09~ch10 并发 → ch11~ch13 IO/HTTP/测试 → ch14 排序 → ch15 毕业项目 → gin-web
1.2 Go 与 Java / Python 核心对照表
| 对比项 | Python(python-dev) | Java(java-dev) | Go(go-dev) |
|---|---|---|---|
| 类型系统 | 动态类型 | 静态类型,编译期检查 | 静态类型,编译期检查 |
| 缩进 / 语法 | 缩进是语法 | {} 与 ; | {} 无分号强制(换行规则) |
| 变量声明 | x = 10 | int x = 10; | x := 10 或 var x int = 10 |
| 字符串 | "hello" | String 不可变 | string 不可变 |
| 列表/数组 | list 动态 | 数组定长 + ArrayList | slice 动态 + 定长 array |
| 空值 | None | null | nil(指针、slice、map、chan、interface) |
| 模块 | import requests | import java.util.List; | import "fmt" + 模块路径 |
| 运行 | python app.py | javac + java | go run / go build |
| 异常 | try/except | try/catch | 多返回值 error(ch07) |
| 并发 | asyncio / 多进程 | Thread / Executor | goroutine + channel(ch09) |
| Web 后续 | django-web / flask-web | spring-boot-web | gin-web |
何时选 Go:云原生组件、高 QPS API、单文件部署、资源占用敏感、K8s/Docker 生态。
何时仍选 Java:企业 Spring 生态、Android、强类型大型团队协作、成熟中间件。
何时仍选 Python:脚本自动化、数据科学、快速原型、Django/Flask 全栈。
本课程采用多语言对照:同一虚构商城业务(slug、is_published、价格分)在不同语言中落地,便于真实选型时做理性权衡。
1.3 安装 Go 1.22+
推荐 Go 1.22 或 1.23(可从 https://go.dev/dl/ 下载)。Go 安装包自带完整工具链(编译器、格式化、测试、模块管理),无需单独安装类似 Maven 的构建工具。
1.3.1 Windows 逐步操作
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1 | 访问 go.dev/dl | 选 Windows amd64 安装包(.msi) |
| 2 | 运行安装程序 | 路径建议英文,默认 C:\Go |
| 3 | 确认环境变量 | 安装器通常自动写入 Path |
| 4 | 新开终端验证 | 旧终端可能未刷新 PATH |
1.3.2 配置与验证(Windows)
| 变量 | 说明 |
|---|---|
Path | 含 C:\Go\bin(或你的 GOROOT\bin) |
GOPATH | 用户工作区,默认 %USERPROFILE%\go |
GO111MODULE | Go 1.16+ 默认 on,模块模式开启 |
# 验证(新开 PowerShell)
go version
# go version go1.22.5 windows/amd64
go env GOROOT
go env GOPATH
go env GO111MODULE
go env GOOS
go env GOARCH
| 命令 | 通过标准 |
|---|---|
go version | 显示 go1.22 或更高 |
go env GOROOT | 指向 Go 安装目录 |
go env GO111MODULE | 为 on |
1.3.3 macOS / Linux 逐步操作
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1 | 下载 macOS pkg 或 Linux tar.gz | amd64 或 arm64 按芯片选择 |
| 2 | macOS:双击 pkg 安装 | 默认 /usr/local/go |
| 3 | Linux:解压到 /usr/local/go | 手动追加 PATH |
| 4 | 或用 Homebrew | brew install go |
# macOS / Linux 验证
go version
export PATH="/usr/local/go/bin:$PATH" # 若未自动配置
go env GOPATH GO111MODULE GOOS GOARCH
1.3.4 GOPATH 与模块模式说明
| 概念 | 说明 |
|---|---|
GOROOT | Go 安装目录(工具链) |
GOPATH | 用户目录,存放 bin/、pkg/ 缓存;模块时代代码不必放 GOPATH 内 |
GO111MODULE=on | 启用 go mod;Go 1.16+ 默认开启 |
| 模块缓存 | $GOPATH/pkg/mod 或 $(go env GOMODCACHE) |
与 Java 对照:GOPATH/pkg/mod类似 Maven 本地仓库~/.m2/repository;go.mod类似pom.xml。
1.4 练习目录 learn-go 与 toolkit-go 初始化
建议在用户目录下创建独立练习根目录,与 learn-java、python-learn 并列:
~/learn-go/ # Windows: %USERPROFILE%\learn-go
├── ch01/
│ └── hello/
│ ├── go.mod
│ └── main.go
├── toolkit-go/ # 贯穿 go-dev 至 ch15
│ ├── go.mod
│ ├── go.sum # go mod tidy 后生成
│ ├── cmd/
│ │ └── toolkit/
│ │ └── main.go
│ ├── internal/ # 私有包(ch08 详讲)
│ │ └── report/
│ └── pkg/ # 可选对外库
└── README.md
1.4.1 初始化模块(Windows)
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1 | 创建目录 | learn-go\toolkit-go |
| 2 | 进入目录 | cd 到项目根 |
| 3 | 初始化模块 | go mod init example.com/toolkit-go |
| 4 | 创建 main.go | 见 1.5 节 |
| 5 | 运行 | go run . 或 go run ./cmd/toolkit |
mkdir $env:USERPROFILE\learn-go\toolkit-go
cd $env:USERPROFILE\learn-go\toolkit-go
go mod init example.com/toolkit-go
1.4.2 初始化模块(macOS / Linux)
mkdir -p ~/learn-go/toolkit-go
cd ~/learn-go/toolkit-go
go mod init example.com/toolkit-go
初始化后生成的 go.mod:
module example.com/toolkit-go
go 1.22
1.5 第一个程序:Hello World 完整代码
1.5.1 根目录 main.go(快速体验)
在项目根创建 main.go:
// main.go — learn-go 入门示例,对照 java-dev HelloWorld
package main
import (
"fmt"
"os"
"runtime"
)
func main() {
fmt.Println("Hello, Go!")
fmt.Printf("Go %s | %s/%s\n", runtime.Version(), runtime.GOOS, runtime.GOARCH)
if len(os.Args) > 1 {
fmt.Println("你好," + os.Args[1])
}
}
要点:
| 概念 | 说明 |
|---|---|
package main | 可执行程序必须是 main 包 |
func main() | 程序入口,类比 Java public static void main |
import "fmt" | 标准库格式化 I/O |
os.Args | 命令行参数,类比 Java String[] args |
| 首字母大写 | 导出标识符;fmt.Println 中 Println 可导出 |
1.5.2 编译与运行(双平台)
Windows(PowerShell):
cd $env:USERPROFILE\learn-go\toolkit-go
go run .
go build -o toolkit-go.exe .
.\toolkit-go.exe
.\toolkit-go.exe 小明
macOS / Linux(bash):
cd ~/learn-go/toolkit-go
go run .
go build -o toolkit-go .
./toolkit-go
./toolkit-go 小明
| 步骤 | Java 对照 | Python 对照 |
|---|---|---|
go run . | mvn exec:java | python main.py |
go build | mvn package 打 jar | 无编译步骤 |
| 生成单文件二进制 | 需 JVM 运行 jar | 需 Python 解释器 |
1.5.3 cmd/ 标准入口(推荐布局)
将入口迁移到 cmd/toolkit/main.go(ch15 毕业项目沿用此结构):
// cmd/toolkit/main.go — toolkit-go 标准入口
package main
import (
"fmt"
"example.com/toolkit-go/internal/version"