首页 > Go学习 > Go语言中的包
2021
09-05

Go语言中的包

包使用package定义,使用import导入,使用自动加载,且包名称必需小写

因为一个目录即表示一个包,所以同一个目录下的包名称必需一致

可以通过使用包的别名来解决包名之间的名称冲突

包的导入

常规导入:

import "packzge1"
import "packzge2"
...
或者
import (
    "packzge1"
    "packzge2"
    ...
)

使用路径

import "./package"
//绝对路径,导入当前文件所在目录下的package目录中的文件
//Go Modules不支持绝对路径,在开启 GO111MODULE 后,无法使用
import "pack_name/package"
//相对路径,自动在相对路径前添加"GOPATH/src/"

点操作符

import . "packzge1"
在包名前有个点,并使用空格和包名隔开
含义就是这个包导入之后调用这个包的函数时,可以省略前缀的包名
如fmt.Println(“hello world”)可以写成Println(“hello world”)

包的别名

可以把包命名成另一个用起来容易记忆的名字,调用包函数时前缀变成了别名的前缀
import diy_name "package"

空白标识符(_)

import _ "package"

使用_操作导入包无法通过包名来调用包中的导出函数,而是只是为了简单的调用其init函数()

导入包和使用包中变量

包的导入实际上就是导入一个目录名

包中变量使用该目录下文件使用package语句声明的包名作为前缀使用

目录名和目录下文件中声明的包名并不需要相同,只是实际使用中我们习惯设置成相同

如现在我们有一个文件夹,文件夹名称为pack_dir,该文件夹下的文件中都在第一行定义了包名为pack_file

import "/path/pack_dir"

func main(){
    pack_file.func_name()
}
以上代码我们可以看到,导入包的时候使用的是目录名pack_dir
但是在实际使用包中函数的时候我们使用的是pack_file这个包名

要理解下划线(_)操作符,首先要理解Go语言中包的导入原理

程序的初始化和执行都起始于main包,如果main包还导入了其它的包,那么就会在编译时将它们依次导入

有时一个包会被多个包同时导入,那么它只会被导入一次

当一个包被导入时,如果该包还导入了其它的包,那么会先将其它包导入进来,然后再对这些包中的包级常量和变量进行初始化,接着执行init函数(如果有的话)

等所有被导入的包都加载完毕了,就会开始对main包中的包级常量和变量进行初始化,然后执行main包中的init函数(如果存在的话),最后执行main函数

import导入包的时候其实是执行了该导入的包里面的init函数,初始化了里面的变量

_操作只是说该包引入了,只初始化里面的init函数和一些变量,不能通过包名来调用其它的函数

这有什么用呢?往往这些init函数里面是注册自己包里面的引擎,让外部可以方便的使用

如很多实现database/sql的引起,在init函数里面都是调用了sql.Register(name string, driver driver.Driver)注册自己,然后外部就可以使用了。

最后编辑:
作者:qingheluo
这个作者貌似有点懒,什么都没有留下。

留下一个回复

你的email不会被公开。