Go微服务实战
上QQ阅读APP看书,第一时间看更新

6.1.1 包导入

每一个包在一个项目内都有一个唯一的导入路径,这个导入路径是使用唯一的字符串进行标识的。路径和包的名称之间没有必然的联系,不过一般包名默认会使用路径最后一个“/”后的名称,比如对于math/rand,包名就是rand。当然,这只是大多数情况,也有例外,比如main包就是一层包,不需要使用“/”。此外,本书前面的示例也没有遵守这一默认规则,后续的示例会遵守这一规则。

包的名称是在每一个源码文件的第一行通过package关键字声明的,而编程时用到的第三方包则是通过import关键字导入的。每导入一个包就用一次import关键字,用法如下:


import "fmt"
import "os"

也可以使用圆括号把需要导入的包写在一起:


import(
    "fmt"
    "os"
)

注意

导入的包必须在程序内用到,否则编译无法通过。其实这也是为了提高编译速度。

以上规则和用法,前面的示例已体现过。不过有些特殊的地方还是要强调一下。在同一个项目当中,只是要求导入路径唯一,并没有要求包名称唯一。比如前面提到的rand包,除了math/rand,crypto/rand的导入路径也是rand包。如果要在同一个代码文件中导入这两个包,则会出现冲突,这时就必须为包取别名,示例如下:


import(
    crand "crypto/rand"
    "math/rand"
)

注意

别名仅在当前文件中有效,即便是同一个包下的其他文件导入相同包也不可以直接使用此别名,除非那个文件也在导入时取了同样的别名。别名的应用非常广泛,除了这种不得已的情况,为了便捷也可以给导入的包取一些容易记的别名。

除了取别名以外,如果要用的包内函数名不会与其他包重复,也可以在引入的时候使用“.”,这样使用该函数的时候就不用通过前置包名来调用了。比如:


import . "fmt"

使用了“.”后,在使用打印函数的时候就可以直接用Println(“ ”),而不需要像以前那样通过代码fmt.Println(“ ”)来实现了。

还有一种情况,有时候需要导入一个包,仅仅是需要这个包执行init函数。init是编译的时候调用的,开发人员不可以在代码里面调用。而除了这个包的init函数以外,其他函数又都用不到,怎么办呢?虽然可以import这个包,但是在代码中如果不用这个包的话,编译就无法通过,所以Go语言专门提供了空导入来应对这个问题。

看一个在数据库连接包的示例:


import(
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
)

这里使用了一个连接MySQL的包,但是一个空导入,因为只需要用到mysql包的init函数。数据库连接的具体知识会在第9章介绍。

在实际项目当中,要经常给包命名,自然也就需要了解Go语言对应包的命名相关知识了。

在Go语言中包的命名提倡简练,所以在项目当中也应当在保证可读性的前提下,让包名称尽可能短。

注意

因为包名比较短,容易和一些关键字或变量名称冲突,所以很多包名都用复数形式,比如bytes、strings。如果需要通过多个单词说明包的意义,可以适当压缩,比如buf就是把buffer压缩而成。