Go语言内部包--控制包成员的对外暴露

昨天

以下文章来源于网管叨bi叨 ,作者KevinYan11

网管叨bi叨每周分享技术类原创文章

问题

Go 语言中的软件包推荐按照:组织名/项目名 的形式安排软件包的文件目录结构,一般「项目名」文件目录下还会按照功能、抽象约定、具体实现等维度再划分一些子目录。在 Go 语言里包的导入路径不同则被判定为不同的包,所以同一个软件包项目下的「功能一」包依赖「功能二」包里的成员时,那么成员必须是导出成员才能被「功能一」包引用。但是这样一来,其他项目或者其他组织的代码也就都可以使用这个导出的成员了,假如包里的一些成员我们只想在指定的包之间共享而不想对外暴露该怎么办呢? Go 语言内部包这个特性可以让我们实现这个目标。

内部包

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

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

示例

.|-- resources|   |-- internal|   |   |-- cpu|   |   |   `-- cup.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/目录中的软件包称为内部包。

要为项目创建内部包,只需将包文件放在名为internal/的目录中。当 go 编译器在导入路径中看到带有internal/的软件包被导入时,它将验证导入包的程序文件是否位于internal/目录的父级目录,或父级目录的子目录中。

举例来说导入路径为 /a/b/c/internal/d/e/f 的包,只能被位于/a/b/c目录或者其子目录中的代码引入,而不能被位于/a/b/e 目录或其子目录中的代码引用。

(0)

相关推荐

  • Office文档怎么操作批量提取及电子书图片

    如果系统是Windows 8.1,则需要右击OfficeWiz.exe,在弹出的菜单中选择"以管理员身份运行"来启动该软件. 点击向导窗口中的Next(下一步),设置要提取的文档位 ...

  • go modules:使用 mod 管理项目依赖包,通过vendor实现一键分发编译包

    在go语言1.11版本之前,没有modules机制,所有软件包都在安装在$GOPATH/src目录下.不同项目如果引用了同一个软件包的不同版本,就会造成编译麻烦.修改$GOPATH变量是当时一种比较简 ...

  • R语言 | 向量化操作purrr包

    Python网络爬虫与文本数据分析 在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句. 问题 比如有一个序列ns,现在想得到res,让ns中每一个数字变为平方数,代码如下 ...

  • R语言 | 数据操作tidyr包

    [更新~]Python网络爬虫与文本数据分析 tidyr包 类似于上图成行成列的表数据是干净数据(tidy data),一般每一行表示一条观测记录,每一列表示一个字段(变量)tidyr包是用来操作ti ...

  • R语言 | jiebaR中文分词包

    [更新~] Python网络爬虫与文本数据分析 jiebaR 中文与英文做文本分析很多时候会多一个分词步骤,因为默认情况下,文本分析软件会默认用空格作为分隔符处理文本,所以很多软件需要先将中文文本分词 ...

  • R语言 | 数据操作dplyr包

    [更新~] Python网络爬虫与文本数据分析 dplyr简介 dplyr是R语言的数据分析包,很像python中的pandas,能对dataframe类型的数据做很方便的数据处理和分析操作.最初我也 ...

  • R语言配色方案-RcolorBrewer包

    欢迎来到医科研,这里是白介素2的读书笔记,跟我一起聊临床与科研的故事, 生物医学数据挖掘,R语言,TCGA.GEO数据挖掘. R配色包-RcolorBrewer包  display.brewer.al ...

  • Python:Python语言下载库或包的常见whl文件集合

    Python:Python语言下载库或包的常见whl文件集合Python语言下载库或包的常见whl文件集合地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/# ...

  • “包考上”“包考过”?广告违法!5家教育培训机构被罚

    对教育.培训的效果 作出明示或者暗示的保证性承诺 利用受益者的名义或者形象 作推荐.证明等内容 ...... 这样的广告违法 !!! 近日 广州五家教育培训机构 因发布违法广告 被市场监管部门处罚 据 ...

  • 海南4星级温泉酒店康养,3600一月包吃包住包水包电,你觉得贵吗

    海南4星级温泉酒店康养,3600一月包吃包住包水包电,你觉得贵吗

  • 8个方法消除富贵包(富贵包 = 夺命包)

    去学中医.能健康! 生活中我们经常会看到颈部有一个"大包"的人,因为大多数是那些比较富态,体型较胖的人患有,所以老百姓通常叫它富贵包. 从中医来看,富贵包对应着大椎穴,因为大椎穴是 ...