go 的internal 目录
internal 特性的官方解释
Go 语言中的软件包推荐按照:组织名/项目名 的形式安排软件包的文件目录结构,一般「项目名」文件目录下还会按照功能、抽象约定、具体实现等维度再划分一些子目录。在 Go 语言里包的导入路径不同则被判定为不同的包。
Go语言1.4版本后增加了 Internal packages 特征用于控制包的导入,即internal package只能被特定的包导入。
内部包的规范约定:导入路径包含internal关键字的包,只允许internal的父级目录及父级目录的子包导入,其它包无法导入。
翻译成人话
如上是相对官方的解释(其实我也是从其他地方抄过来的,哈哈)。翻译成人话就是两点
- 之前用变量大小写,限制变量是否能导出的方法,不够用了,需要用
internal来更进一步限制文件目录的导出规则。 internal只能由父级目录或同级目录引用
看个例子
写一个学校的项目,里面包括老师和学生的信息,目录结构可以建成下面的样子,学生和老师的业务逻辑,分别写在 student/internal 和 teacher/internal中,
.
├── go.mod
├── main.go
├── student
│ ├── internal
│ │ └── studentInfo.go
│ └── service.go
└── teacher
├── internal
│ └── teacherInfo.go
└── service.go
这样写,就能使学生和老师之间的代码不能相互引用(main.go 也不能直接引用),做到代码隔离。所有学生的业务逻辑统一通过 student/service.go 对外暴露,老师业务逻辑同理。
其中 main.go中的代码如下所示
import (
"school_demo/student"
"school_demo/teacher"
)
func main() {
student.Service()
teacher.Service()
}
浙公网安备 33010602011771号