- Go语言从入门到精通
- 谢琼编著
- 903字
- 2025-04-02 16:12:16
3.2.4 非执行包名与目录的关系
非执行包的包名可以与目录名不同,但是我们不建议这样做,因为这可能会引起混乱。
3.2.3节的例子中,如果我们将package1.go中的包声明语句改为:
package package2
代码会将包名修改为package2,但是在test1.go中引用该包时,还需要引用package1,这是因为Go语言在编译时查找某个包所引用(也叫“依赖”)的各个其他包时,是以目录名来寻找的,而package1的代码文件仍然在名为package1的目录下。所以在test1包的代码中,仍然需要引用“package1”包,但是在调用package1包中的函数时,则需要用package2作为包名。因此,test1.go的代码应修改为代码3-8。
package main import ( "package1" ) func main() { package2.Hello() }
代码3-8 修改后的test1.go代码
我们也可以修改package1.go和test1.go两个文件的文件名,会发现文件名对编译和执行结果没有影响,起作用的主要是目录名和包名。
一般来说,我们建议目录名和包名保持一致,包中的源代码文件也尽量与包名保持一致,这样会避免混淆。
对于go build和go install命令,后面也可以加上src目录下的包目录名来直接进行编译,这样做的好处是可以在任何目录下(“在某某目录下”表示在命令行界面中切换到该目录中)而不一定是该包源代码目录下进行编译。这种情况下,go build命令将在当前目录下生成该包的可执行文件,go install命令还是在bin目录下生成该包的可执行文件。图3.19演示了在C:\tmp目录下使用go build和go install命令编译test1包的过程。

图3.19 在非源代码目录下编译某个包
图3.19中使用的dir c:\goprjs\bin\test1*命令的作用是将bin目录中所有文件名以test1开头的文件列出。星号“*”叫作通配符,可以指代个数不定的任意字符。
至此,我们对3.2.1节中总结的Go语言程序文件组织方式的概括再增加以下几条。
- Go语言主要是以包来组织程序文件的,每个包对应一个目录,目录名和包名不用必须相同但应尽量保证相同。
- 包中代码文件可以是一个或多个,文件名称不重要,包名称和目录名称比较重要;因此,后面我们提到编译程序时,一般会说编译某个包而不是某个代码文件。
- 可执行程序的代码也对应一个包,其中可以引用Go语言标准库中的包和自己编写的包。
- 除标准库外,自己编写的可执行包、非执行包以及以后可能使用到的第三方编写的包的代码文件都会被放在src目录下,可执行包编译后的可执行文件一般会放到bin目录下(使用go build命令除外,但一般不推荐用go build命令,因为在源代码目录下生成可执行文件会造成不必要的混乱)。