#每天一个知识点# 代码包目录、代码包引入路径和代码包依赖关系
一个代码包可以由若干Go源文件组成。一个代码包的源文件须都处于同一个目录下。 一个目录(不包含子目录)下的所有源文件必须都处于同一个代码包中,亦即这些源文件开头的package pkgname语句必须一致。 所以,一个代码包对应着一个目录(不包含子目录),反之亦然。 对应着一个代码包的目录称为此代码包的目录。 一个代码包目录下的每个子目录对应的都是另外一个独立的代码包。

对于Go官方工具链来说,一个引入路径中包含有internal目录名的代码包被视为一个特殊的代码包。 它只能被此internal目录的直接父目录(和此父目录的子目录)中的代码包所引入。 比如,代码包.../a/b/c/internal/d/e/f和.../a/b/c/internal只能被引入路径含有.../a/b/c前缀的代码包引入。

当一个代码包中的某个文件引入了另外一个代码包,则我们说前者代码包依赖于后者代码包。

Go不支持循环引用(依赖)。 如果一个代码包a依赖于代码包b,同时代码包b依赖于代码包c,则代码包c中的源文件不能引入代码包a和代码包b,代码包b中的源文件也不能引入代码包a。

当然,一个代码包中的源文件不能也没必要引入此代码包本身。

今后,我们称一个程序中含有main入口函数的名称为main的代码包为程序代码包(或者命令代码包),称其它代码包为库代码包。 程序代码包不能被其它代码包引入。一个程序只能有一个程序代码包。

代码包目录的名称并不要求一定要和其对应的代码包的名称相同。 但是,库代码包目录的名称最好设为和其对应的代码包的名称相同。 因为一个代码包的引入路径中包含的是此包的目录名,但是此包的默认引入名为此包的名称。 如果两者不一致,会使人感到困惑。

另一方面,最好给每个程序代码包目录指定一个有意义的名字,而不是它的包名main。
展开
评论