2.2 main 包
程序的主入口可以在 main.go 文件里找到,如代码清单 2-2 所示。虽然这个文件只有 21 行代码,依然有几点需要注意。
代码清单 2-2 main.go
01 package main
02
03 import (
04 "log"
05 "os"
06
07 _ "github.com/goinaction/code/chapter2/sample/matchers"
08 "github.com/goinaction/code/chapter2/sample/search"
09 )
10
11 // init 在 main 之前调用
12 func init() {
13 // 将日志输出到标准输出
14 log.SetOutput(os.Stdout)
15 }
16
17 // main 是整个程序的入口
18 func main() {
19 // 使用特定的项做搜索
20 search.Run("president")
21 }
每个可执行的 Go 程序都有两个明显的特征。一个特征是第 18 行声明的名为 main
的函数。构建程序在构建可执行文件时,需要找到这个已经声明的 main
函数,把它作为程序的入口。第二个特征是程序的第 01 行的包名 main
,如代码清单 2-3 所示。
代码清单 2-3 main.go:第 01 行
01 package main
可以看到, main
函数保存在名为 main
的包里。如果 main
函数不在 main
包里,构建工具就不会生成可执行的文件。
Go 语言的每个代码文件都属于一个包,main.go 也不例外。包这个特性对于 Go 语言来说很重要,我们会在第 3 章中接触到更多细节。现在,只要简单了解以下内容:一个包定义一组编译过的代码,包的名字类似命名空间,可以用来间接访问包内声明的标识符。这个特性可以把不同包中定义的同名标识符区别开。
现在,把注意力转到 main.go 的第 03 行到第 09 行,如代码清单 2-4 所示,这里声明了所有的导入项。
代码清单 2-4 main.go:第 03 行到第 09 行
03 import (
04 "log"
05 "os"
06
07 _ "github.com/goinaction/code/chapter2/sample/matchers"
08 "github.com/goinaction/code/chapter2/sample/search"
09 )
顾名思义,关键字 import
就是导入一段代码,让用户可以访问其中的标识符,如类型、函数、常量和接口。在这个例子中,由于第 08 行的导入,main.go 里的代码就可以引用 search
包里的 Run
函数。程序的第 04 行和第 05 行导入标准库里的 log
和 os
包。
所有处于同一个文件夹里的代码文件,必须使用同一个包名。按照惯例,包和文件夹同名。就像之前说的,一个包定义一组编译后的代码,每段代码都描述包的一部分。如果回头去看看代码清单 2-1,可以看看第 08 行的导入是如何指定那个项目里名叫 search
的文件夹的。
读者可能注意到第 07 行导入 matchers
包的时候,导入的路径前面有一个下划线,如代码清单 2-5 所示。
代码清单 2-5 main.go:第 07 行
07 _ "github.com/goinaction/code/chapter2/sample/matchers"
这个技术是为了让 Go 语言对包做初始化操作,但是并不使用包里的标识符。为了让程序的可读性更强,Go 编译器不允许声明导入某个包却不使用。下划线让编译器接受这类导入,并且调用对应包内的所有代码文件里定义的 init
函数。对这个程序来说,这样做的目的是调用 matchers
包中的 rss.go 代码文件里的 init
函数,注册 RSS 匹配器,以便后用。我们后面会展示具体的工作方式。
代码文件 main.go 里也有一个 init
函数,在第 12 行到第 15 行中声明,如代码清单 2-6 所示。
代码清单 2-6 main.go:第 11 行到第 15 行
11 // init 在 main 之前调用
12 func init() {
13 // 将日志输出到标准输出
14 log.SetOutput(os.Stdout)
15 }
程序中每个代码文件里的 init
函数都会在 main
函数执行前调用。这个 init
函数将标准库里日志类的输出,从默认的标准错误( stderr
),设置为标准输出( stdout
)设备。在第 7 章,我们会进一步讨论 log
包和标准库里其他重要的包。
最后,让我们看看 main
函数第 20 行那条语句的作用,如代码清单 2-7 所示。
代码清单 2-7 main.go:第 19 行到第 20 行
19 // 使用特定的项做搜索
20 search.Run("president")
可以看到,这一行调用了 search
包里的 Run
函数。这个函数包含程序的核心业务逻辑,需要传入一个字符串作为搜索项。一旦 Run
函数退出,程序就会终止。
现在,让我们看看 search
包里的代码。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论