Golang模块级私有包(internal package mechanism)详解

引言

熟悉Golang的同学应该都知道Golang的包机制,一个包中的程序实体有两种访问权限:可导出(其他包可以访问)和不可导出(其他包不能访问,包内可访问)。

但是这两种访问权限并不能满足所有的场景,例如组织WEB项目目录结构的场景。组织WEB项目目录结构的典型场景如下:一般把项目中处理业务逻辑的部分放在一起(分为三层,分别是接口表示层(api)、业务逻辑层(bll),数据访问层(dal)),不希望其他部分代码访问业务逻辑部分的代码,而允许业务逻辑部分代码访问其他部分代码,这样严格分为业务逻辑部分和非业务逻辑部分,结构清晰,方便维护。要从根本上防止其他部分代码不能访问业务逻辑部分的代码一般语言都没有提供这种机制,Golang从1.4引入的内部包机制(将包命名为internal)就可以实现这一点。

什么是内部包(Internal packages)?

内部包就是将代码放在名为internal的目录或名为internal的目录的子目录中。有以下特点:

  • /a/b/c/internal/d/e/f目录中的代码只能被/a/b/c目录中代码(文件或子目录中代码)导入,而不能被/a/b/g目录下的代码导入;
  • $GOROOT/src/pkg/internal/xxx只能被$GOROOT/src/目录中代码导入(文件或子目录中代码);
  • $GOROOT/src/pkg/net/http/internal只能被net/http和net/http/* 导入;
  • $GOPATH/src/mypkg/internal/foo只能被$GOPATH/src/mypkg目录中的代码导入(文件或子目录中代码)。

示例说明

以如下目录结构为例说明:

├── pkg1
│   ├── internal
│   │   ├── sub2
│   │       └── sub2.go
│   │   └── test1.go
│   │
│   ├── sub1
│   │   └── test2.go
│   └── pkg1.go
├── pkg2
│   └── pkg2.go
└── main.go

可以导入internal包的代码:test2.go、pkg1.go和sub2.go,不能导入internal包的代码:main.go和pkg2.go。

可以导入sub2包的代码:test2.go、pkg1.go和test1.go,不能导入sub2包的代码:main.go和pkg2.go。

小结

本文介绍了internal包的作用和使用场景,一定要亲手写代码体会一下其使用方法和使用场景。

Golang 中,可以创建私有package ,只有特定的人才可以访问它。下面是创建私有 package 的步骤: 1. 创建一个新的文件夹,用于存放私有package 。 2. 在该文件夹下创建一个名为 `go.mod` 的文件,用于管理 package 的依赖关系。 3. 在该文件夹下创建一个名为 `main.go` 的文件,用于编写私有的代码。 4. 在 `main.go` 中定义需要私有的函数、变量等。 5. 在需要访问该私有 package 的项目中,可以使用相对路径来引用该 package 。 下面是一个示例: 假设我们需要创建一个私有package ,用于存放一些敏感的代码。我们可以将该 package 存放在一个名为 `private` 的文件夹中,只有特定的人才能够访问它。 1. 创建一个名为 `private` 的文件夹。 2. 在 `private` 文件夹中创建一个名为 `go.mod` 的文件,内容如下: ``` module github.com/yourusername/private ``` 其中,`yourusername` 是你的 GitHub 用户名。 3. 在 `private` 文件夹中创建一个名为 `main.go` 的文件,内容如下: ```go package private func SecretFunction() { // do something sensitive } ``` 其中,我们定义了一个函数 `SecretFunction`,含一些敏感的代码。 4. 在需要访问 `private` package 的项目中,可以使用相对路径来引用该 package ,例如: ```go package main import "./private" func main() { private.SecretFunction() } ``` 在上面的示例中,我们使用相对路径 `./private` 来引用 `private` package ,并调用其中的 `SecretFunction` 函数。 注意:为了确保私有 package 的安全性,需要将其存放在一个只有特定人员可以访问的位置,并采取适当的安全措施。同时,在使用私有 package 时,需要确保该 package 已经被正确地安装和编译,并且只有授权的人才能够访问它。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路多辛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值