编程进阶网 编程进阶网
首页
  • 计算机原理
  • 操作系统
  • 网络协议
  • 数据库原理
  • 面向对象
  • 设计原则
  • 设计模式
  • 系统架构
  • 性能优化
  • 编程原理
  • 方案设计
  • 稳定可靠
  • 工程运维
  • 基础认知
  • 线性结构
  • 树与哈希
  • 工业级实现
  • 算法思想
  • 实战与综合
  • 算法题考核
  • C语言入门
  • C综合案例
  • C专栏博客
  • C标准集库
  • C++入门教程
  • C++综合案例
  • C++专栏博客
  • C++开发技巧
  • Java入门教程
  • Java综合案例
  • Java专栏博客
  • Go入门教程
  • Go综合案例
  • Go专栏博客
  • Go开发技巧
  • JavaScript入门
  • JavaScript高级
  • Android库解读
  • Android专栏
  • Android智能硬件
  • iOS ObjC入门
  • iOS Swift入门
  • iOS入门精通
  • Web之Html手册
  • Web之TypeScript
  • Web之Vue高级进阶
  • Linux之QML入门
  • Linux之QT核心库
  • Linux实践开发
  • Python教程
  • Shell&Bash教程
  • 工具脚本
  • 自动化脚本
  • 质量保障
  • 产品思考
  • 软实力
  • 开发流程
  • Git应用
  • 技术模版
  • 技术规范
  • Markdown
  • Mermaid
  • 开源协议
  • JSON工具
  • 文本工具
  • 图片处理
  • 文档转化
  • 代码压缩
  • 关于我
  • 自我精进
  • 职场管理
  • 职场面试
  • 心情杂货
  • 友情链接

杨充

专注编程 · 终身学习者
首页
  • 计算机原理
  • 操作系统
  • 网络协议
  • 数据库原理
  • 面向对象
  • 设计原则
  • 设计模式
  • 系统架构
  • 性能优化
  • 编程原理
  • 方案设计
  • 稳定可靠
  • 工程运维
  • 基础认知
  • 线性结构
  • 树与哈希
  • 工业级实现
  • 算法思想
  • 实战与综合
  • 算法题考核
  • C语言入门
  • C综合案例
  • C专栏博客
  • C标准集库
  • C++入门教程
  • C++综合案例
  • C++专栏博客
  • C++开发技巧
  • Java入门教程
  • Java综合案例
  • Java专栏博客
  • Go入门教程
  • Go综合案例
  • Go专栏博客
  • Go开发技巧
  • JavaScript入门
  • JavaScript高级
  • Android库解读
  • Android专栏
  • Android智能硬件
  • iOS ObjC入门
  • iOS Swift入门
  • iOS入门精通
  • Web之Html手册
  • Web之TypeScript
  • Web之Vue高级进阶
  • Linux之QML入门
  • Linux之QT核心库
  • Linux实践开发
  • Python教程
  • Shell&Bash教程
  • 工具脚本
  • 自动化脚本
  • 质量保障
  • 产品思考
  • 软实力
  • 开发流程
  • Git应用
  • 技术模版
  • 技术规范
  • Markdown
  • Mermaid
  • 开源协议
  • JSON工具
  • 文本工具
  • 图片处理
  • 文档转化
  • 代码压缩
  • 关于我
  • 自我精进
  • 职场管理
  • 职场面试
  • 心情杂货
  • 友情链接
  • README
  • C语言入门精通

  • Cpp入门到精通

  • Java入门精通

  • Go入门到精通

    • 入门教程

      • README
      • Go简史
        • 目录介绍
        • 1.1 本章学习目标
        • 1.2 Go 诞生的工业背景
        • 1.3 三位创始人与设计哲学
        • 1.4 Go 版本演进总览
        • 1.5 关键里程碑深度解读
          • 1.5.1 Go 1.0(2012):API 稳定承诺
          • 1.5.2 Go 1.5(2015):Go 自举与并发 GC
          • 1.5.3 Go 1.11(2018):modules 终结 GOPATH 时代
          • 1.5.4 Go 1.14(2020):异步抢占
          • 1.5.5 Go 1.18(2022):泛型登场
          • 1.5.6 Go 1.21(2023):内置函数与 slog
          • 1.5.7 Go 1.22(2024):range int 与循环变量
        • 1.6 Go 与同时代语言的横向对比
        • 1.7 Go 1.23+ 与未来路线图
        • 1.8 本章小结
        • 1.9 思考题
        • 1.10 推荐阅读
          • 卷内
          • 跨卷
          • 外部资料
      • 基础语法
      • 数据类型
      • 运算符
      • 复合类型
      • 流程语句
      • 函数
      • 指针与逃逸
      • 结构体与方法
      • 接口与多态
      • 错误处理
      • 并发goroutine
      • 通道channel
      • 同步sync包
      • IO和文件
      • 标准库与泛型
      • 工程化与模块
      • 特性图谱
    • 综合案例

    • 专栏博客

    • 开发技巧

  • JavaScript入门

  • CodeX
  • Go入门到精通
  • 入门教程
杨充
2026-05-21
目录

Go简史

# 第 1 章 Go 简史与版本演进

本章是卷一的"开篇"——在写一行 Go 代码之前,先看清楚这门语言从哪里来、要往哪里去。 关键词:Go 1.0 / 1.5 自举 / 1.11 modules / 1.14 异步抢占 / 1.18 泛型 / 1.21 内置函数 / 1.22 range int


# 目录介绍

  • 1.1 本章学习目标
  • 1.2 Go 诞生的工业背景
  • 1.3 三位创始人与设计哲学
  • 1.4 Go 版本演进总览
  • 1.5 关键里程碑深度解读
    • 1.5.1 Go 1.0(2012):API 稳定承诺
    • 1.5.2 Go 1.5(2015):Go 自举与并发 GC
    • 1.5.3 Go 1.11(2018):modules 终结 GOPATH 时代
    • 1.5.4 Go 1.14(2020):异步抢占
    • 1.5.5 Go 1.18(2022):泛型登场
    • 1.5.6 Go 1.21(2023):内置函数与 slog
    • 1.5.7 Go 1.22(2024):range int 与循环变量
  • 1.6 Go 与同时代语言的横向对比
  • 1.7 Go 1.23+ 与未来路线图
  • 1.8 本章小结
  • 1.9 思考题
  • 1.10 推荐阅读

# 1.1 本章学习目标

读完本章,你应当:

  • ✅ 知道 Go 是为解决什么问题而设计的(不是"另一个 C",而是"Google 的工程问题")
  • ✅ 能说出 Go 1.0 → 1.22 至少 5 个里程碑式的版本变化
  • ✅ 知道哪些"老 Go 代码"已经是反例(GOPATH / interface{} / 手写 sort.Interface / io/ioutil ...)
  • ✅ 能解释 Go 故意舍弃的特性(继承、异常、运算符重载、隐式转换、断言宏)以及背后的取舍

# 1.2 Go 诞生的工业背景

2007 年,Google 内部面临三个困境:

  1. C++ 编译慢 —— 大型 C++ 项目编译一次要十几分钟,影响迭代速度
  2. 多核时代缺乏好语言 —— 主流语言(C++/Java)的并发模型笨重(线程 + 锁),难以利用多核
  3. 依赖管理混乱 —— 大型项目的 header 依赖图爆炸,IDE 索引都吃力

2007 年 9 月 21 日,Robert Griesemer、Rob Pike、Ken Thompson 在 Google 内部启动 Go 项目,目标是:

A language designed for systems programming with networking and multiprocessing in mind, that compiles fast and is simple to read.

简而言之三句话:

  • 编译要快(解决 C++ 痛点)
  • 天然并发(goroutine + channel)
  • 语法极简(25 个关键字)

2009 年 11 月 10 日,Go 在 Google I/O 上正式开源。

# 1.3 三位创始人与设计哲学

创始人 背景 对 Go 的影响
Ken Thompson UNIX / B / C / Plan 9 / UTF-8 共同发明人 语法极简主义 / Plan 9 汇编 / defer-based 资源管理
Rob Pike UNIX / Plan 9 / UTF-8 共同发明人 CSP 并发模型 / channel / 接口隐式实现
Robert Griesemer V8 / HotSpot JVM 类型系统 / 编译器架构 / go vet

设计哲学(Rob Pike 的演讲《Less is exponentially more》):

Less is more.    (少即是多)
Composition over inheritance.    (组合优于继承)
Don't communicate by sharing memory; share memory by communicating.    (CSP)
A little copying is better than a little dependency.    (宁可复制,不要乱依赖)
Errors are values.    (错误是值,不是异常)
1
2
3
4
5

Go 故意舍弃的特性(不是"做不到",而是"不要做"):

特性 Go 不要的理由
继承(class extends) 复杂、脆弱;用接口 + 嵌入字段替代
异常(throw / catch) 控制流不透明;用 error 显式返回
运算符重载 让 a + b 含义不可读
隐式数值转换 int32 不能直接给 int64,必须 int64(x)
三元运算符 ?: 鼓励多行 if,可读性优先
宏 / 模板元编程 编译复杂度爆炸;用泛型(克制版)替代
函数默认参数 用变长参数 / 选项模式(functional options)

# 1.4 Go 版本演进总览

版本 发布时间 关键特性 影响
Go 1.0 2012-03 API 稳定承诺 工业可用起点
Go 1.1 2013-05 性能大幅提升 / 方法值 —
Go 1.2 2013-12 三索引 slice s[i:j:k] 卷一第 5 章会讲
Go 1.4 2014-12 go generate 卷二第 10 案例会用
Go 1.5 2015-08 Go 自举 + 并发 GC runtime 进入新时代
Go 1.7 2016-08 context 包入标准库 卷一第 12 章
Go 1.8 2017-02 GC stop-the-world < 100µs —
Go 1.11 2018-08 modules(go.mod) 终结 GOPATH 时代
Go 1.13 2019-09 errors.Is/As、%w 卷一第 11 章
Go 1.14 2020-02 异步抢占 runtime 调度大改
Go 1.16 2021-02 embed 嵌入静态资源 卷一第 15 章
Go 1.17 2021-08 寄存器 ABI / Apple Silicon 原生支持 —
Go 1.18 2022-03 泛型 + any 语言级别变革
Go 1.19 2022-08 atomic 类型化(atomic.Int64) 卷一第 14 章
Go 1.20 2023-02 errors.Join / PGO 预览 卷一第 11 章
Go 1.21 2023-08 slices / maps / cmp 包入库 / min/max/clear 内置 / slog 日志 现代化标准库
Go 1.22 2024-02 for 循环变量每轮新建 / for i := range N 整数遍历 / HTTP ServeMux 路由增强 终结循环变量陷阱
Go 1.23 2024-08 range func 自定义迭代器 / unique 包 —
Go 1.24 2025-02 泛型类型别名 / 弱引用 / 改进的 PGO —

# 1.5 关键里程碑深度解读

# 1.5.1 Go 1.0(2012):API 稳定承诺

Go 1.0 的核心承诺:所有 1.x 版本对 1.0 时已存在的 API 保持向后兼容——10 年前的 Go 代码今天还能编译。

这件事看似平淡,实际是工业语言的底线承诺——对比 Python 2 → 3 的撕裂、Scala 2 → 3 的迁移痛苦,Go 1.x 的 API 稳定性让企业敢用。

// 2012 年的 Hello World,今天依然能跑
package main

import "fmt"

func main() {
    fmt.Println("Hello, 世界")
}
1
2
3
4
5
6
7
8

# 1.5.2 Go 1.5(2015):Go 自举与并发 GC

两件大事同时发生:

  1. Go 1.5 编译器自举:之前用 C 写的编译器(基于 Plan 9)改用 Go 重写。从此 Go 进入"用自己写自己"的良性循环。
  2. 并发 GC:之前 GC 是 STW(stop-the-world)的,1.5 引入并发标记 + 并发清扫(清扫总是并发的,1.5 让标记也并发了)。STW 时间从几百 ms 降到几十 ms。

➡ 展开见 卷三第 7 章「GC 三色标记演进」。

# 1.5.3 Go 1.11(2018):modules 终结 GOPATH 时代

GOPATH 时代的痛:

# GOPATH 时代,所有项目必须放在 $GOPATH/src/github.com/xxx/yyy 下
# 同一个库不能存在多个版本
# 团队协作必须共享相同的 GOPATH 布局
1
2
3

modules 时代:

# 任意目录都能 init 项目
mkdir myproj && cd myproj
go mod init github.com/yourname/myproj
go mod tidy   # 自动管理依赖
1
2
3
4

go.mod 的诞生意义重大——它不仅是依赖管理工具,还引入了最小版本选择算法(Minimal Version Selection, MVS)——一个工程上更确定、可重现的依赖求解策略,详见卷一第 17 章。

# 1.5.4 Go 1.14(2020):异步抢占

Go 1.14 之前,goroutine 抢占只能在函数调用时发生(协作式抢占)。这意味着一段没有函数调用的紧密循环(比如 for { i++ })会永远占用 P,让调度器卡死。

// Go 1.13 及之前:这段代码会让 GC 卡死
package main

import "runtime"

func main() {
    runtime.GOMAXPROCS(1)
    go func() {
        for {} // ❌ 没有函数调用,调度器抢不走
    }()
    runtime.GC() // 卡住
}
1
2
3
4
5
6
7
8
9
10
11
12

Go 1.14 引入基于信号的异步抢占(SIGURG),让运行时可以在任意指令处中断 goroutine。这是 Go 调度器的一次"成人礼"。

➡ 展开见 卷三第 6 章「GMP 调度器原理」。

# 1.5.5 Go 1.18(2022):泛型登场

Go 自 2009 年开源以来,"要不要加泛型"是社区争论最久的话题。最终在 2022 年 Go 1.18 落地。

// Go 1.18 之前:要么 interface{} + 类型断言(损失类型安全),要么手写多份代码
func Max(a, b int) int { if a > b { return a }; return b }
func MaxFloat(a, b float64) float64 { ... }

// Go 1.18+:泛型
func Max[T cmp.Ordered](a, b T) T {
    if a > b { return a }
    return b
}
1
2
3
4
5
6
7
8
9

值得注意的是,Go 的泛型故意不像 C++ 模板那么强大——没有特化、没有 SFINAE、没有元编程。这是设计上的取舍。

➡ 展开见 卷一第 16 章 + 卷三第 11 章。

# 1.5.6 Go 1.21(2023):内置函数与 slog

Go 1.21 是"现代化标准库"的一次大跃进:

新增 作用
min(a, b, ...) / max(a, b, ...) 内置函数,告别手写
clear(m) / clear(s) 内置函数,map/slice 清空
slices 包 slices.Sort / slices.Contains / slices.Index ...
maps 包 maps.Keys / maps.Values / maps.Clone
cmp 包 cmp.Ordered 约束 / cmp.Compare
log/slog 结构化日志(终于!)替代 log 包
sync.OnceFunc / OnceValue 优雅的延迟初始化
PGO 正式版 编译期优化基于运行时 profile

# 1.5.7 Go 1.22(2024):range int 与循环变量

两个语义级变化:

变化一:循环变量每轮迭代新建

// Go 1.21 及之前:所有 goroutine 共享同一个 v(经典陷阱)
for _, v := range []int{1, 2, 3} {
    go func() { fmt.Println(v) }()  // 可能全打印 3
}

// Go 1.22+:每轮迭代 v 是新变量,不再有此陷阱
1
2
3
4
5
6

变化二:for i := range N 整数遍历

// Go 1.21 及之前
for i := 0; i < 10; i++ { fmt.Println(i) }

// Go 1.22+:整数也能 range
for i := range 10 { fmt.Println(i) }
1
2
3
4
5

⚠️ 本书基线选择 Go 1.22 的核心原因:循环变量陷阱是新手 Top 1 的坑,1.22 之后从语言层面消除,本书所有代码都默认这个语义。

# 1.6 Go 与同时代语言的横向对比

维度 Go Java Python C++ Rust
类型系统 静态强类型 静态强 动态强 静态强 静态强
内存管理 GC GC GC 手动 / 智能指针 所有权(编译期)
并发模型 goroutine + channel thread + JUC 协程 / GIL thread + std::async async / await
泛型 Go 1.18+(克制) 强(含通配符) 鸭子类型 模板元编程 trait + 单态化
编译速度 极快(秒级) 中(JVM 预热) 解释型 慢(分钟级) 慢
启动速度 极快(< 100ms) 慢(JVM 启动) 中 极快 极快
内存占用 低 高(JVM) 中 极低 极低
学习曲线 平缓 中 平缓 陡 陡
适合场景 后端 / 微服务 / CLI 企业应用 数据 / 脚本 系统 / 游戏 / 高频 系统 / WASM / 嵌入式

Go 的位置:在"启动快 + 内存低 + 编程简单"的交集上独特占位——这就是为什么 Docker、Kubernetes、etcd、Prometheus、TiDB 全部用 Go 写。

# 1.7 Go 1.23+ 与未来路线图

版本 重要特性
Go 1.23(2024-08) range func(自定义迭代器)、unique 包
Go 1.24(2025-02) 泛型类型别名、改进 PGO、crypto 重构
Go 1.25(计划 2025-08) 进一步的调度器优化 / 减少 GC 抖动

未来方向(Go team 公开提案):

  • 更好的 error 处理(? 操作符曾被讨论但被否决)
  • 更强的类型推导
  • 更好的 cgo 性能
  • WebAssembly Component Model 集成

# 1.8 本章小结

  • Go 是为"工业大规模工程"设计的语言,舍弃了大量"花哨特性"
  • 三位创始人都是 UNIX / Plan 9 系,深受"少即是多"哲学影响
  • Go 1.0 → 1.22 演进的主线:自举 → 并发 GC → modules → 异步抢占 → 泛型 → 现代化标准库 → 循环变量修复
  • 本书所有代码以 Go 1.22 为基线,默认享受循环变量修复、泛型、slices/maps 等现代特性

读完本章后,建议立即跳到第 2 章动手——光看历史不写代码,永远学不会编程。

➡ 下一章:第 2 章 基础语法与 Hello World

# 1.9 思考题

  1. 为什么 Go 故意不要继承?请用接口 + 嵌入字段写一段代码模拟"动物 → 哺乳动物 → 狗"的关系,并说说这种写法相对继承的优劣。
  2. Go 1.5 的"自举"为什么是大事?编译器从 C 写改用 Go 写,对开发者有什么直接影响?
  3. 为什么 Go 1.14 的"异步抢占"被认为是"成人礼"?没有它会发生什么?
  4. Go 1.18 的泛型是"克制版泛型",与 C++ 模板相比缺了什么?为什么这是设计取舍而不是技术做不到?
  5. Go 1.22 的循环变量修改属于"破坏性变更",违反 Go 1.0 的兼容承诺吗?请查阅官方说明给出答案。

# 1.10 推荐阅读

# 卷内

  • 第 2 章 基础语法与 Hello World
  • 第 17 章 工程化与模块(go.mod / MVS 算法)
  • 第 18 章 特性图谱(按版本与重要度索引)

# 跨卷

  • 卷三第 6 章 GMP 调度器原理(讲清 1.14 异步抢占)
  • 卷三第 7 章 GC 三色标记演进(讲清 1.5/1.8 GC 演进)
  • 卷三第 11 章 泛型与类型约束(讲清 1.18 泛型实现)

# 外部资料

  • Go FAQ: History of Go (opens new window) — 官方 FAQ
  • Less is exponentially more (opens new window) — Rob Pike 的设计哲学
  • Go at Google: Language Design in the Service of Software Engineering (opens new window) — Rob Pike 的 SPLASH 论文
  • The Go Programming Language and Environment (opens new window) — CACM 2022 综述
上次更新: 2026/06/10, 11:13:41
README
基础语法

← README 基础语法→

最近更新
01
信号崩溃快速排查
06-15
02
CoreDump破案
06-15
03
perf火焰图实战
06-15
更多文章>
Theme by Vdoing | Copyright © 2019-2026 杨充 | MIT License | 桂ICP备2024034950号 | 桂公网安备45142202000030
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式