自定义包必须放在模块根目录或GOPATH/src对应路径中,import路径须与go.mod声明的模块名及子目录名严格匹配,禁止使用./相对路径;包名须全小写且与目录名一致,导出标识符首字母必须大写。
自定义包必须放在模块根目录下或 GOPATH/src 对应路径中
Go 不允许直接 import 一个本地目录(比如
)来跨项目使用,除非你明确启用 Go Modules 并在模块内组织结构。如果你看到
或
,说明当前工作目录没有
,或者导入路径没对上模块声明。
正确做法是:在项目根目录执行
(模块名建议用域名格式,如
),然后把自定义包放在子目录里,例如:
此时
的包声明必须是
,且导入时写成
(不是
,也不是
)。
模块名(
第一行)决定导入路径前缀
子目录名决定导入路径后缀,二者拼起来才是完整 import 路径
不推荐用
相对导入——它只在
单文件模式下临时有效,无法被其他项目复用
函数/变量首字母大写才可导出
Go 的可见性规则非常严格:只有首字母大写的标识符(
、
、
)才能被外部包访问;
、
、
在包外完全不可见,编译会报
。
立即学习
“
go语言免费学习笔记(深入)
”;
这个规则和包名、文件名、目录名都无关,只看符号本身是否“导出”。常见错误包括:
写了
然后在 main 中调用
→ 报错
包里定义了
,想在外部读取 → 不行,得改成
类型嵌套字段小写,如
→ 外部无法访问
记住:导出与否,只看第一个 Unicode 字母是否为大写(不是 ASCII,所以中文、希腊字母等也适用规则)。
go语言参考手册 中文CHM版
Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。本文给大家带来Go参考手册,需要的可以来下载! Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。 Go 语言特色 简洁、快速、安全 并行、有趣、开源 内存管理、v数组安全、编译
下载
包名必须与所在目录名完全一致且全小写
如果目录叫
,那么所有
文件顶部必须写
;写成
或
都会导致
失败,报
或
。
这个约束是硬性的,不是风格建议。尤其注意:
不能含下划线(
❌)、不能含大写字母(
❌)、不能是 Go 关键字(
❌)
多个
文件必须声明相同包名,哪怕只有一个文件也要遵守
包名可以和导入路径最后一段不同(比如目录
下包名仍是
),但强烈建议保持一致,否则容易混淆
go run 只能运行 package main,别试图直接运行自定义包
当你执行
,一定会遇到
。这不是 bug,是 Go 构建模型的强制设计:自定义包只是库,不是可执行单元。
正确流程永远是两步:
写一个独立的
(必须
+
)
在它里面
,再调用
不要把
塞进
目录里,也不要给自定义包加
—— 这会让 Go 认为它是可执行程序,反而破坏复用性。
最易被忽略的一点:自定义包里的
函数会在被导入时自动执行,且顺序不可控。如果包里有副作用(比如改全局变量、开连接、读配置),要特别小心初始化时机。
./utilscannot find package "utils"import "./utils": cannot import relative pathgo.modgo mod init myprojectgithub.com/you/myprojectmyproject/
├── go.mod
├── main.go
└── utils/
└── string.goutils/string.gopackage utils"myproject/utils""./utils""utils"go.mod./xxxgo runPrintStrVersionConfigprintStrversionconfigcannot refer to unexported name xxxfunc helper()utils.helper()var count = 0var Count = 0type User struct { name string }namevalidators.gopackage validatorspackage Validatorspackage validators_v2go buildinvalid package namefound packages xxx and yyy in same directorymy_utilsMyUtilstype.gogithub.com/you/pkg/v2v2go run utils/string.gogo run: cannot run non-main packagemain.gopackage mainfunc main()import "myproject/utils"utils.Reverse("abc")main.goutils/func main()init()