注册 登录

清河洛

Go语言中的包

qingheluo2021-09-05清河洛315
包使用package定义,使用import导入,使用自动加载,且包名称必需小写因为一个目录即表示一个包,所以同一个目录下的包名称必需一致可以通过使用包的别名来解决包名之间的名称冲突包的导入常规导入:import "packzge1" import "packzge2" ... 或者 import ( "packzge1" "packzge2" ... ) 使用路径import "./package" //绝对路径,导入当前文件所在目录下的package目录中的文件 //Go Modules不支持绝对路径,在开启 GO111MODULE 后,无法使用 import ...

包使用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)注册自己,然后外部就可以使用了。



网址导航