无论如何都不要这样做,因为语言规范允许编译器实现拒绝此类构造。引用Spec:Package子句:
共享相同PackageName的一组文件构成了一个包的实现。 一个实现可能要求包的所有源文件都驻留在同一目录中。
而是“结构化”您的文件名以模仿文件夹结构;例如代替文件
foo/foo1.gofoo/bar/bar1.gofoo/bar/bar2.go
您可以简单地使用:
foo/foo1.gofoo/bar-bar1.gofoo/bar-bar2.go
同样,如果您的程序包太大,甚至需要多个文件夹来“托管”该程序包实现的文件,那么您应该真正考虑不将其作为单个程序包实现,而是将其分成多个程序包。
另请注意,Go
1.5引入了内部软件包。如果
internal在包文件夹中创建特殊的子文件夹,则可以在其中创建任意数量的子包(即使使用多个级别)。您的软件包将能够导入和使用它们(或更确切地说,所有植根于您的软件包文件夹的软件包),但是外面没有其他人能够这样做,这将是编译时错误。
例如,您可以创建一个
foo程序包,一个
foo/foo.go文件和一个
foo/internal/bar程序包。
foo将能够导入
foo/internal/bar,但例如
boo不会。此外
foo/baz还可以导入和使用
foo/internal/bar,因为它是植根于
foo/。
因此,您可以使用内部软件包将大软件包分解为较小的软件包,从而将源文件有效地分组为多个文件夹。您唯一需要注意的就是将您的程序包要导出的所有内容放入该程序包中,而不是放入内部程序包中(因为这些程序包是不可导入的,或者从“外部”可见)。



