0
点赞
收藏
分享

微信扫一扫

go 函数init

 函数init

每个包可以包含任意多个init函数,这些函数都会在程序执行开始的时候被调用。所有被编译器发现的init函数都会安排在main函数之前执行。init函数用在设置包、初始化变量或者其他要在程序运行前优先完成的引导工作。

以数据库驱动为例,database下的驱动在启动时执行init函数会将自身注册到sql包里,因为sql包在编译时并不知道这些驱动的存在,等启动之后sql才能调用这些驱动。让我们看看这个过程中init函数做了什么,如代码清单 3-5 所示。

代码清单 3-5 init函数的用法

01 package postgres

02

03 import (

04 "database/sql"

创建一个postgres驱动的

05 )

06 实例。这里为了展现init的

07 func init() { 作用,没有展现其定义细节。

08 sql.Register("postgres", new(PostgresDriver))

09 }

这段示例代码包含在 PostgreSQL 数据库的驱动里。如果程序导入了这个包,就会调用init 函数,促使 PostgreSQL 的驱动最终注册到 Go 的sql包里,成为一个可用的驱动。

在使用这个新的数据库驱动写程序时,我们使用空白标识符来导入包,以便新的驱动会包含到sql包。如前所述,不能导入不使用的包,为此使用空白标识符重命名这个导入可以让init 函数发现并被调度运行,让编译器不会因为包未被使用而产生错误。

现在我们可以调用sql.Open方法来使用这个驱动,如代码清单 3-6 所示。

代码清单 3-6 导入时使用空白标识符作为包的别名

01 package main 02

03 import (  使用空白标识符导入

04 "database/sql"  包,避免编译错误。

05

06  _ "github.com/goinaction/code/chapter3/dbdriver/postgres"  07 )

08 调用sql包提供的Open方法。该方法能

091011  func main() {   sql.Open("postgres", "mydb")  } 工作的关键在于己的 init 函数将自身注册到了postgres 驱动通过自sql包。

3.4  使用 Go 的工具

在前几章里,我们已经使用过了go这个工具,但我们还没有探讨这个工具都能做哪些事情。让我们进一步深入了解这个短小的命令,看看都有哪些强大的能力。在命令行提示符下,不带参数直接键入go这个命令:

$ go  

go这个工具提供了很多功能,如图 3-1 所示。

图 3-1  go命令输出的帮助文本

通过输出的列表可以看到,这个命令包含一个编译器,这个编译器可以通过build命令启动。正如预料的那样,build和clean命令会执行编译和清理的工作。现在使用代码清单 3-2 里的源代码,尝试执行这些命令: go build hello.go  

当用户将代码签入源码库里的时候,开发人员可能并不想签入编译生成的文件。可以用

clean命令解决这个问题: go clean hello.go  

调用clean后会删除编译生成的可执行文件。让我们看看go工具的其他一些特性,以及使用这些命令时可以节省时间的方法。接下来的例子中,我们会使用代码清单 3-7 中的样例代码。

代码清单 3-7 使用io包的工作

01 package main 02

03 import (

04 "fmt"

05 "io/ioutil"

06 "os"

07

08 "github.com/goinaction/code/chapter3/words"

09 )

10

11 // main是应用程序的入口

12 func main() {

13 filename := os.Args[1]

14

15 contents, err := ioutil.ReadFile(filename)

16 if err != nil {

17 fmt.Println(err)

18 return

19 }

20

21  text := string(contents)

22

23 count := words.CountWords(text)

24 fmt.Printf("There are %d words in your text.\n", count)

25 }

如果已经下载了本书的源代码,应该可以在$GOPATH/src/github.com/goinaction/code/chapter3/words 找到这个包。确保已经有了这段代码再进行后面的内容。

大部分 Go 工具的命令都会接受一个包名作为参数。回顾一下已经用过的命令,会想起build

命令可以简写。在不包含文件名时,go工具会默认使用当前目录来编译。 go build  

因为构建包是很常用的动作,所以也可以直接指定包:

go build github.com/goinaction/code/chapter3/wordcount  

也可以在指定包的时候使用通配符。3 个点表示匹配所有的字符串。例如,下面的命令会编译 chapter3目录下的所有包:

go build github.com/goinaction/code/chapter3/...  

除了指定包,大部分 Go 命令使用短路径作为参数。例如,下面两条命令的效果相同: go build wordcount.go

go build .  

要执行程序,需要首先编译,然后执行编译创建的wordcount或者wordcount.exe程序。不过这里有一个命令可以在一次调用中完成这两个操作: go run wordcount.go  

go run命令会先构建 wordcount.go 里包含的程序,然后执行构建后的程序。这样可以节省

好多录入工作量。

做开发会经常使用go build和go run命令。让我们看另外几个可用的命令,以及这些命令可以做什么。

举报

相关推荐

0 条评论