go导包

1.单行导入与多行导入

在go语言中,一个包可包含多个.go文件(这些文件必须得在同一级文件夹中),只要这些.go文件的头部都使用package关键字声明了同一个包

单行导入:

1
2
import "fmt"
import "sync"

多行导入:

1
2
3
4
import(
"fmt"
"sync"
)

2.使用别名

导入两个具有同一包名的包时产生冲突,此时这里为其中一个包定义别名

1
2
3
4
import (
"crypto/rand"
mrand "math/rand" // 将名称替换为mrand避免冲突
)

导入名字很长的包,可以简写

1
import hw "helloworldtestmodule"

防止导入的包和本地的变量冲突

1
import pathpkg "path"

3.使用点操作

对于高频使用的包,可以通过使用.定义为“自己人”,这样使用方法的时候就不用在使用包名,直接使用方法即可

1
2
3
4
5
import . "fmt"

func main() {
Println("hello, world")
}

4.包的初始化

每个包都有一个init函数。

1.init函数优先于main函数执行

2.在一个包引用链中,包的初始化是深度优先的,比如,有这样一个包引用关系:main->A->B->C,那么初始化顺序为:

1
C.init→B.init→A.init→main

3.init函数不能被其他函数调用

5.包的匿名导入

当导入一个包时,如果这个包没有被使用,在编译时,是会报错的

但是有些情况下,我们导入一个包,只想执行里的init函数来初始化任务,此时可以使用匿名导入,用法如下,其中下划线为空白标识符,不能被访问

1
2
// 注册一个png decoder
import _ "image/png"

6.相对导入和绝对导入

绝对导入:从$GOPATH/src$GOROOT 或者 $GOPATH/pkg/mod 目录下搜索包并导入

相对导入:从当前目录下搜索包并开始导入,就像下面这样

1
2
3
4
5
6
import (
"./module1"
"../module2"
"../../module3"
"../module4/module5"
)

使用相对导入需要注意的点:

  • 项目不要放在$GOPATH/src下,否则会报错。

  • Go Modules不支持相对导入,在你开启GO111MODULE后,无法使用相对导入

使用相对导入,可读性会大打折扣,更多还是推荐使用绝对导入。

7.包导入路径优先级

如果使用govendor

当我们导入一个包时,它会:

  • 1.先从项目根目录的vendor目录中查找
  • 2.最后从$GOROOT/src目录下查找
  • 然后从$GOPATH/src目录下查找
  • 都找不到就报错

如果使用 go modules

如果导入的包有域名,会先在$GOPATH/pkg/mod下查找,找不到就连网去网站上寻找,找不到或者找到的不是一个包则报错。

如果导入的包没有域名,就只会到$GOROOT里查找。

如果目录下含有vendor目录时,不管包有没有域名,都只会在vendor目录中查找。

通常vendor目录通过go mod vendor命令生成,这个命令会将项目依赖全部打包到你的项目目录下的vendor文件夹中。