返回介绍

2.2 main 包

发布于 2024-10-11 12:38:58 字数 2934 浏览 0 评论 0 收藏 0

程序的主入口可以在 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 行导入标准库里的 logos 包。

所有处于同一个文件夹里的代码文件,必须使用同一个包名。按照惯例,包和文件夹同名。就像之前说的,一个包定义一组编译后的代码,每段代码都描述包的一部分。如果回头去看看代码清单 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文