Go语言中import路径严格对应文件系统路径,包名必须与目录名一致且全小写,导出标识符首字母须大写,导入路径以模块根目录为基准,init函数执行顺序不可控。

Go 语言中没有“安装包”或“发布包”的中间步骤,import 路径直接对应文件系统路径,自定义包本质就是一组放在同一目录下的 .go 文件,只要路径可寻、命名合规、导出正确,就能被其他代码直接引用。
包名必须与目录名一致,且全小写
Go 不允许包名含大写字母或下划线(如 my_pkg 或 MyPackage),否则 go build 会报错 invalid package name。目录名也必须完全匹配——不是“建议”,而是强制约束。
- 包声明语句
package utils必须出现在utils/目录下的所有.go文件顶部 - 若目录叫
Utils,但包声明是package utils,go工具会拒绝识别该目录为有效包 - 导入时用的路径(如
"github.com/you/project/utils")和本地相对路径(如"./utils")都依赖这个一致性
导出标识符必须首字母大写,且不能跨包访问未导出名
Go 的可见性由标识符首字母决定:大写 = 导出(public),小写 = 包内私有。这点和 Python 的 _ 前缀或 Java 的 public 关键字逻辑不同,容易误以为“只要在同一个模块里就能用”。
-
func DoWork()可被外部调用;func doWork()只能在utils包内部使用 - 即使两个包在同一目录(不推荐),也不能绕过导出规则访问对方的小写名
- 结构体字段也遵循同样规则:
type Config struct { Host string; port int }中只有Host可被外部读写,port完全不可见
导入路径取决于模块根目录,不是当前工作目录
运行 go mod init example.com/myapp 后,所有 import 语句中的路径都以 example.com/myapp 为基准。哪怕你在 myapp/utils 目录下执行 go run main.go,也不能写 import "utils"。
Sylius开源电子商务平台是一个开源的 PHP 电子商务网站框架,基于 Symfony 和 Doctrine 构建,为用户量身定制解决方案。可管理任意复杂的产品和分类,每个产品可以设置不同的税率,支持多种配送方法,集成 Omnipay 在线支付。功能特点:前后端分离Sylius 带有一个强大的 REST API,可以自定义并与您选择的前端或您的微服务架构很好地配合使用。如果您是 Symfony
立即学习“go语言免费学习笔记(深入)”;
- 正确写法是
import "example.com/myapp/utils" - 如果想用相对路径测试(比如没推送到远程),可用
replace在go.mod中重定向:replace example.com/myapp/utils => ./utils - 本地开发时常用
go run -mod=mod main.go配合replace,避免反复go mod tidy拉取不存在的远程路径
最常被忽略的是:包初始化顺序不可控,init() 函数执行时机只保证在 main() 之前、且按导入依赖图拓扑排序,但同级包之间无明确先后。若你的自定义包依赖另一个包的 init() 侧边效应(比如全局配置加载),很可能在某些构建环境下静默失败。









