以下内容摘录整理自:kevin_tech 的 Go语言内部包–控制包成员的对外暴露
这个问题其实从来没考虑过,甚至都没有碰到过,毕竟还是浅尝辄止的初学者。
虽说如此,但依然还是有必要整理留作经验的,如何让一个package,不被其他包使用?假如包里的一些成员我们只想在指定的包之间共享而不想对外暴露该怎么办呢?
实现这一功能,其实就涉及到Go语言1.4版本后新增的一个特性:Internal。
internal package限定该包只能被特定的包导入。
内部包的规范约定:导入路径包含internal关键字的包,只允许internal的父级目录及父级目录的子包导入,其它包无法导入。
例如如下路径:
.
|-- resources
| |-- internal
| | |-- cpu
| | | `-- cpu.go
| | |-- mem
| | | `-- mem.go
| |-- input
| | |-- input.go
| `-- mainboard.go
|-- prototype
| `-- professional.go
|-- go.mod
|-- go.sum
如上包结构的程序,resources/internal/cpu
和resources/internal/mem
只能被resources
包及其子包resources/input
中的代码导入,不能被prototype
包里的代码导入。当在prototype
包的代码中导入并调用resources/internal/cpu
包的函数时,编译器根据文件的目录结构判断出来prototype
包相对于被导入的包是外部包,所以整个程序会编译失败,报类似下面的错误:
use of internal package /resources/internal/cpu not allowed
internal/
是 go 编译器在编译程序时可以识别的特殊目录名,除非两个包都具有相同的祖先,否则它将阻止另一个包导入internal/目录下的包。因此,我们将internal/目录中的软件包称为内部包。
如您从本文得到了有价值的信息或帮助,请考虑扫描文末二维码捐赠和鼓励。
如本文对您有用,捐赠和留言 将是对我最好的支持~(捐赠可转为站内积分)
如愿意,请向朋友推荐本站,谢谢。
尊重他人劳动成果。转载请务必附上原文链接,我将感激不尽。
场景太少了,业务开发中如果单纯为了不被其它包使用,则把相应用户故事写到一个包里并且小写字母开头声明私有即可。。。
我实在想不到这个关键词的使用场景在哪里。。。😅