Go语言1.4版本增加了 Internal packages 特征用于控制包的导入,即internal package只能被特定的包导入。

内部包的规范约定:导出路径包含internal关键字的包,只允许internal的父级目录及父级目录的子包导入,其它包无法导入。

示例

.
|-- checker
|   |-- internal
|   |   |-- cpu
|   |   |   `-- cpu.go
|   |   `-- ram
|   |       `-- ram.go
|   `-- server.go
|-- go.mod
|-- go.sum
`-- main.go

如上包结构的程序,checker/internal/cpuchecker/internal/ram只能被checker包及其子包中的代码导入,不能被main.go导入。当在main.go中导入并调用其函数,编译期会报如下错误:

$ go build
main.go:10:2: use of internal package app/testing/checker/internal/cpu not allowed