- Go语言从入门到精通
- 谢琼编著
- 1462字
- 2025-04-02 16:12:15
3.2 Go语言程序的组织
3.2.1 Go语言中程序文件的组织方式
Go语言中,组织程序文件的方式主要是通过结合目录、包(package)与文件来实现的。
在第2章中,我们介绍过Go语言开发根目录下的src子目录(如果按本书介绍的环境搭建,应该是C:\goprjs\src目录),为了方便起见,我们将这一目录简称为src目录。相应地,Go语言开发根目录下的bin子目录简称为bin目录。一般来说,将编写的程序源代码文件(后面简称为代码文件或代码)都放置在src目录下的某个子目录下。例如,回顾第2章中的Hello world!程序,就是放在src目录下的hello子目录中的。
Go语言的代码文件中,第一行一般都是一个包的名称声明。例如,Hello world!程序中(见代码3-3),第一条语句package main的作用是告诉Go语言编译器这个代码属于main包。在Go语言中,名字叫作main的包是一个特殊的包,表示该包编译后会生成一个可执行文件;反过来说,如果要编写一个能够被编译成可执行文件的程序,则代码必须是在main包中的(main包中可以使用其他包)。main包中必须有一个名为main的函数(关于函数的定义将在3.3节具体解释,目前只需要知道func开头的一条语句定义了一个名字叫作main的函数,后面一对大括号括起来的内容就是这个函数具体的代码),这是程序起始执行的函数。其他名字的包编译后不会生成可执行文件,这些包一般是供其他包来调用的。
package main import ( "fmt" ) func main() { fmt.Println("Hello world!") }
代码3-3 回顾hello/hello.go
注意
与很多其他语言不同,Go语言中每一条语句不必以分号“;”结尾。
同一个包中可以有多个文件,这可以避免出现一个太大的代码文件,也可以更清晰地把代码分类组织在不同的文件中。同一目录下所有的代码文件只能属于同一个包,如果属于不同的包,编译时会提示有错误。也就是说,属于不同包的文件只能放在不同的目录下。
main包中不论有多少文件,其中的main函数有且只能有一个,否则编译时也会提示有错误。
下面我们将Hello world!程序改写成具有两个文件的包,来验证上述内容。首先在src目录下新建一个packageTest子目录,并在其中新建两个代码文件,分别命名为sub.go和main.go,其中sub.go文件的代码见代码3-4(注意在LiteIDE中也要打开packageTest目录)。
package main import ( "fmt" ) func hello() { fmt.Println("Hello world!") }
代码3-4 packageTest/sub.go
sub.go代码中实际上仅仅定义了一个hello函数,作用是输出“Hello world!”的字样。main.go中的代码见代码3-5。
package main func main() { hello() }
代码3-5 packageTest/main.go
main.go中所做的唯一一件事就是调用了hello函数。使用LiteIDE编辑好这两个文件,用快捷键Ctrl+F8来进行go install命令编译后,会在bin目录下生成一个名字叫作packageTest.exe的可执行文件,如图3.15所示。

图3.15 在LiteIDE中编译packageTest程序代码
注意,Go语言编译后的可执行文件是以该代码文件所在的目录名而不是代码中的包名来命名的,因此,虽然主程序的文件名是main.go,包名是main,但是生成的可执行文件的名字是packageTest.exe。
如图3.16所示,执行packageTest程序,得到的结果与原来单个hello.go代码的结果是相同的。但是,如果用go run命令来执行,会发现和之前的结果有所不同,如图3.17所示。

图3.16 运行packageTest程序

图3.17 单独执行main.go和sub.go代码
无论用go run命令执行代码main.go还是sub.go,都会提示有错误而得不到想要的输出结果。这时候,需要在go run命令后带上所有的源代码文件作为参数才能得到正确的执行结果,即执行go run main.go sub.go命令。如果在MacOS或Linux系统中直接执行go run *.go命令,就可以在有多个源代码文件时运行程序。
Go语言中程序文件的组织可以简单概括如下。
- Go语言中,程序文件主要是按目录和包来组织的。
- 每个包对应一个目录。
- 每个包可以有多个代码文件。
- 可执行包必须以main命名,其中应有且只能有一个main函数;一般的可执行程序都对应在一个目录下的main包,编译程序时将主要编译该包。
- 可执行包生成的可执行文件是以目录名来命名的,生成的可执行文件的位置根据编译所用的命令有所不同,go build命令将可执行文件生成在与代码文件名相同的目录下,go install命令将可执行文件生成在bin目录下。