章节摘要:代码写到几千行就必须回答三个问题:怎么分包分目录、怎么管依赖、怎么处理失败。本章讲 Go 的答案——package 与大小写可见性、init 函数的执行顺序、go.mod 与 go.sum 构成的模块体系、replace 与 vendor 的本地化手段,以及以 error 接口为核心的显式错误处理:包装、解包、自定义错误类型。最后落到项目结构的推荐布局。
阅读完本章,你应当能够:
工程化的本质是控制依赖方向与失败路径——包管前者,error 管后者。
从 package 声明到 go mod 全流程:可见性、init 顺序、别名导入、空白标识符、版本选择、replace 与 vendor。
error 接口、if err 检查模式、%w 包装链、errors.Is 与 errors.As、自定义错误类型、panic 与 error 的分界。
目录布局的演进与推荐形态、包设计原则、依赖与 vendor、测试目录策略。
4.1 先解决"代码放哪、谁可见",4.2 解决"跨包传递失败",4.3 把两者合成为可长期演进的项目骨架——结构是容器,错误处理是血管。
┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │ 4.1 包与模块 │ ─▶ │ 4.2 错误处理 │ ─▶ │ 4.3 项目结构 │ │ 边界与依赖 │ │ 包装与解包 │ │ 布局与演进 │ └──────────────┘ └──────────────┘ └────────┬─────────┘ ▼ 第5章 在工程骨架里写并发
工程化章节建议边学边重构:把你前面章节练习时写的小程序,按本章推荐的目录布局拆成几个包,并用 errors.Is/As 改造成显式错误处理。动手完成一次"单文件 → 多包"的拆分,比任何理论都更能让你理解包可见性、init 顺序与依赖管理为什么这样设计。