首页 > temp > 简明python教程 >
-
25. Go 语言中关于包导入必学的 8 个知识点(2)
然后再次运行
总结一下,使用相对导入,有两点需要注意
-
项目不要放在
$GOPATH/src
下,否则会报错(比如我修改当前项目目录为GOPATH后,运行就会报错) -
Go Modules 不支持相对导入,在你开启 GO111MODULE 后,无法使用相对导入。
最后,不得不说的是:使用相对导入的方式,项目可读性会大打折扣,不利用开发者理清整个引用关系。
所以一般更推荐使用绝对引用的方式。使用绝对引用的话,又要谈及优先级了
8. 包导入路径优先级
前面一节,介绍了三种不同的包依赖管理方案,不同的管理模式,存放包的路径可能都不一样,有的可以将包放在 GOPATH 下,有的可以将包放在 vendor 下,还有些包是内置包放在 GOROOT 下。
那么问题就来了,如果在这三个不同的路径下,有一个相同包名但是版本不同的包,我们导入的时候,是选择哪个进行导入呢?
这就需要我们搞懂,在 Golang 中包搜索路径优先级是怎样的?
这时候就需要区分,是使用哪种模式进行包的管理的。
如果使用 govendor
当我们导入一个包时,它会:
-
先从项目根目录的
vendor
目录中查找 -
然后从
$GOROOT/src
目录下查找 -
最后从
$GOPATH/src
目录下查找 -
都找不到的话,就报错。
为了验证这个过程,我在创建中创建一个 vendor 目录后,就开启了 vendor 模式了,我在 main.go 中随便导入一个包 pkg,由于这个包是我随便指定的,当然会找不到,找不到就会报错, Golang 会在报错信息中打印中搜索的过程,从这个信息中,就可以看到 Golang 的包查找优先级了。
如果使用 go modules
你导入的包如果有域名,都会先在 $GOPATH/pkg/mod
下查找,找不到就连网去该网站上寻找,找不到或者找到的不是一个包,则报错。
而如果你导入的包没有域名(比如 "fmt"这种),就只会到 $GOROOT
里查找。
还有一点很重要,当你的项目下有 vendor 目录时,不管你的包有没有域名,都只会在 vendor 目录中想找。
通常vendor
目录是通过 go mod vendor
命令生成的,这个命令会将项目依赖全部打包到你的项目目录下的 verdor 文件夹中。
留言纠错
由于这个号,没有留言功能,文章中不可避免(尽管我已经尽力验证充分)会出现一些小毛病。
为了避免文章因我个人语言表达不当,或者个人理解有误,而误导初学者,请大家共同监督,若文章有说的不对的地方,请在下方链接里留言,帮我指正。谢谢大家,共同努力。Fighting