请知悉:本文最近一次更新为 2年 前,文中内容可能已经过时。

以下内容摘录整理自: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/cpuresources/internal/mem只能被resources包及其子包resources/input中的代码导入,不能被prototype包里的代码导入。当在prototype包的代码中导入并调用resources/internal/cpu包的函数时,编译器根据文件的目录结构判断出来prototype包相对于被导入的包是外部包,所以整个程序会编译失败,报类似下面的错误:

use of internal package /resources/internal/cpu not allowed

internal/ 是 go 编译器在编译程序时可以识别的特殊目录名,除非两个包都具有相同的祖先,否则它将阻止另一个包导入internal/目录下的包。因此,我们将internal/目录中的软件包称为内部包。


如您从本文得到了有价值的信息或帮助,请考虑扫描文末二维码捐赠和鼓励。

尊重他人劳动成果。转载请务必附上原文链接,我将感激不尽。


与《go语言内部包如何控制包成员的对外暴露》相关的博文:


2
留言

avatar
😀
😀😁😂😅😭🤭😋😘🤔😰😱🤪💪👍👎🤝🌹👌
Javen
Javen
【🔥精神鼓励】

场景太少了,业务开发中如果单纯为了不被其它包使用,则把相应用户故事写到一个包里并且小写字母开头声明私有即可。。。
我实在想不到这个关键词的使用场景在哪里。。。😅