
这个实验用代码和隔离缓存观察go run、go build、go get、go mod download、go mod tidy分别做了什么。实验在.lab中创建嵌套模块 不会修改仓库根目录的go.mod和go.sum。先记住结论go run和go build会按需下载模块文件已经完整记录、但本地缓存缺失的依赖。源码新增一个第三方import而go.mod还没有对应模块时通常要先执行go get 包路径或者明确使用允许修改模块文件的模式。go get的重点是选择依赖版本并修改go.mod为了完成版本解析它也会下载。go mod download的重点是把确定版本的模块放进本地缓存它不会根据源码判断 哪个import应该新增到go.mod。go mod tidy的重点是让源码、go.mod、go.sum对齐。它会加入缺失的必要依赖 删除不再提供相关包的依赖并清理校验和。tidy删除的是模块文件中的依赖记录不会删除$GOMODCACHE中已经下载的源码。三种状态对照1. 源码已经import但go.mod没有记录命令结果go run/go build默认报错提示使用go get添加依赖。go get 包路径解析版本、写入go.mod/go.sum并下载源码。go mod download无参数时不会从import猜依赖即使显式下载模块版本也不会因此把它加入go.mod。go mod tidy扫描源码添加缺少的必要模块和校验记录并按需下载。2. 源码没有import但go.mod写了模块命令结果go run/go build不会删除该记录由于代码不需要其包通常不下载完整源码但可能按模块图需要读取元数据。go get 模块版本保留、添加或调整指定版本并下载go get 模块none才是显式删除。go mod downloadGo 1.17 及以后无参数时会下载主模块明确require的模块即使源码没有直接 import。go mod tidy如果它对源码、测试、工具和依赖图确实都不相关就从go.mod/go.sum删除缓存源码仍保留。3. 源码有importgo.mod/go.sum记录完整但缓存为空命令结果go run/go build按需自动下载然后运行或构建。go get 包路径下载并可能按参数重新选择版本没有版本后缀时可能升级到最新版。go mod download下载已确定版本到缓存不编译、不运行。go mod tidy为分析包图而下载保留必要依赖并整理直接/间接标记和校验记录。如果只是手写了go.mod但还没有对应的go.sum条目当前 Go 默认可能以missing go.sum entry拒绝run/build。可使用go get、go mod tidy或go mod download建立校验记录显式使用-modmod也允许构建命令修正模块文件。建议先tidy再run