Go 项目中 internal 目录是控制包可见性的标准约定,仅允许同一模块及其子目录导入,外部模块导入会报错;它非语法特性,而是工具链强制规则,要求路径含 /internal/ 且全小写、为一级目录。

Go 项目中使用 internal 目录是控制包可见性的标准方式——它让某些包仅对当前模块及其子模块可见,对外部模块不可导入。这不是语法特性,而是 Go 工具链(go build、go test 等)强制执行的约定。
internal 不是关键字,而是一个受保护的目录名。只要路径中包含 /internal/,Go 就会检查导入该包的代码是否位于同一模块根目录下(或其子目录),否则报错:use of internal package not allowed。
github.com/user/myapp,myapp/internal/db 可被 myapp/cmd/server 或 myapp/internal/handler 导入github.com/other/lib 尝试 import "github.com/user/myapp/internal/db" → 编译失败internal 必须全小写,且必须是路径中的一级目录(如 pkg/internal/util 不受保护,只有 /internal/ 才生效)一个清晰、可维护的结构通常按职责分层,避免过度嵌套:
internal/config —— 加载配置、解析环境变量,不暴露给外部internal/storage —— 封装数据库、Redis、文件系统等实现,提供统一接口internal/service —— 核心业务逻辑,依赖 config 和 storage,但不依赖 handlers
internal/handlers —— HTTP/gRPC 路由和请求处理,只导出 handler 函数,不暴露结构体所有这些目录都放在项目根目录下的 internal/ 下,例如:myapp/internal/storage/postgres.go。
Go 鼓励单向依赖:高层包可依赖低层包,反之不行。比如 handlers → service → storage → config 是合理链路。
storage 又去 import service
service 定义了 Storer 接口,storage 实现它,则接口应放在 service 或独立的 internal/port 中(而非 storage 内)internal/port 或 internal/contract 放共享接口,保持抽象与实现分离新手容易把 internal 当作“私有包”随意堆砌,结果反而增加耦合或阻碍测试。
internal/util —— 按领域归属更利于维护(如 internal/httputil、internal/jsonutil)xxx_test.go)可以放在 internal/xxx 下,也能访问内部符号;但集成测试建议放在 test/ 或 cmd/ 同级的 e2e/
internal
基本上就这些。internal 不是黑魔法,用好它靠的是明确边界意识和持续重构的习惯。
以上就是如何为Go项目创建内部包结构_Go internal包结构说明的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号