internal

之前没注意这个包名的特殊意义,只知道是内部,但是没想到Go直接将这个命名的包设置为模块级私有访问权限,之前项目中proto生成的.pb.go都放在internal包里,我试图在其他项目引入,一直失败,报错use of internal package xxx not allowed。

查了一下原来是在 Go 1.5 及后续版本中,可以通过创建 internal 代码包让一些程序实体仅仅能被当前模块中的其他代码引用。这是第三种访问权限:模块级私有。一个 Go 项目里的 internal 目录下的 Go 包,只可以被本项目内部的包导入。项目外部是无法导入这个 internal 目录下面的包的。

.
├── module1
│   ├── go.mod
│   ├── internal
│   │   └── pkga
│   ├── pkg1
│   └── pkg2
└── module2
    ├── go.mod
    └── pkg1

module1 中的 internal/pkga 包可以被 module1pkg1pkg2 包所导入。但无法被 module2pkg1 包所导入。

ref:internal 包的使用规则