
在一个项目中,引入下面这个包,会报错
import (
"github.com/zeromicro/go-zero/internal/devserver"
)
use of internal package github.com/zeromicro/go-zero/internal/devserver not allowed
could not import github.com/zeromicro/go-zero/internal/devserver (invalid use of internal package "github.com/zeromicro/go-zero/internal/devserver")
这是因为,在 Go 语言中包名包含 internal 是一种特殊的约定,用于限制包的可见性。
Go 工具链对 internal 目录有特殊处理,这是 Go 模块系统中的一个访问控制机制。
它能帮助我们隐藏内部实现细节,防止外部模块误用私有代码
这是 go1.4 官方文档给出的解释
https://go.dev/doc/go1.4#internalpackages
internal 的包,只能被其父目录及其子目录下的代码导入
目录结构_1
github.com/myapp/
├── main.go
├── internal/
│ └── helper/
│ └── utils.go
└── external/
└── consumer.go
✅ main.go 可以正常导入,因为它和 internal/ 同属于 myapp/ 目录。
❌ external/consumer.go 不能导入该 internal 包,即使 external/ 和 internal/ 是同级目录,Go 也认为它“不在允许范围内”。
目录结构_2
mymod/
├── internal/ ← 仅 mymod/ 下的代码可访问
└── service/
├── internal/ ← 仅 service/ 及其子目录可访问
└── user/
└── handler.go
✅ mymod/main.go 可以访问 mymod/internal,但不能访问 mymod/service/internal。
✅ service/user/handler.go 可以访问 service/internal,也可以访问 mymod/internal(因为它在 mymod 子树下)。
远程包
本地包都不行,远程包里带 internal 的更不行