发布成功的硬指标是能被他人 go get 成功且不报 unknown revision;module path 必须与 git 仓库 url 完全一致,tag 需带 v 前缀并推送远程,导出标识符首字母大写,v2+ 版本须修改 module path。

能被别人 go get 成功,不报 unknown revision,才是发布成功的硬指标。其他都是锦上添花。
module path 必须和 Git 仓库 URL 完全一致
这是最容易卡住的第一步。你写 go mod init 时填的路径,就是别人将来 import 和 go get 用的地址,不能缩写、不能本地路径、不能大小写错。
- ✅ 正确:你的 GitHub 仓库是
https://github.com/yourname/mymodule,那就必须执行go mod init github.com/yourname/mymodule - ❌ 错误:
go mod init mymodule、go mod init ./mymodule、go mod init Github.com/YourName/mymodule(大小写不匹配) - Git 服务必须支持 HTTPS,且仓库设为 public;自建 GitLab 或私有 Gitee 需额外配
GOPROXY或GOPRIVATE,普通用户基本用不了
v1.0.0 这个 tag 必须带 v 前缀且推送到远程
Go 模块只认形如 v1.0.0 的注解 tag,轻量 tag(git tag v1.0.0 不加 -a)或漏推送,都会导致下游 go get 失败,错误提示却很模糊——常表现为 unknown revision 或静默拉取 main 分支。
- 打 tag 要用:
git tag -a v1.0.0 -m "first release" - 推送要指定 tag:
git push origin v1.0.0(别用git push --tags,容易混入测试 tag) - 验证是否生效:在空目录下运行
go list -m -json github.com/yourname/mymodule@v1.0.0,能返回 JSON 才算真正就位
公开函数名必须首字母大写
Go 没有 public 关键字,可见性全靠命名约定。小写开头的 hello() 或 utils 包,外部根本 import 不进来,也不会出现在 pkg.go.dev 文档里。
- ✅ 可导出:
func Hello(name string) string、type Config struct{...}、var DefaultTimeout = 30 - ❌ 不可导出:
func hello(name string) string、type config struct{...}、var defaultTimeout = 30 - 包名可以小写(如
package stringutil),但包内供外部调用的标识符必须大写
v2+ 版本必须改 module path,不能只改 tag
从 v1 升级到 v2,不是简单打个 v2.0.0 就完事。Go 要求主版本升级必须体现在导入路径里,否则会拒绝解析。
- v1 路径:
module github.com/yourname/mymodule→ 导入用import "github.com/yourname/mymodule" - v2 路径:
module github.com/yourname/mymodule/v2→ 导入必须用import "github.com/yourname/mymodule/v2" - v2 代码建议放在独立分支或子目录(如
/v2),同时保留 v1 分支继续维护 bugfix - 千万别在同一个
go.mod里用replace指向本地路径来“模拟”多版本——这只会让你的模块对别人不可用
最常被忽略的是:打完 tag 后没验证 go list 是否返回正常,就急着发 README 或喊大家试用。等别人反馈 go get 失败再排查,时间全耗在 Git 权限、tag 格式、path 大小写这些基础点上。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











