go import导入包详解
文章目录
- 1 单行导入
- 2 多行导入
- 3 使用别名
- 4 使用点操作
- 5. 包的初始化
- 6. 包的匿名导入
- 7. 导入的是路径还是包?
- 8. 相对导入和绝对导入
- 9. 包导入路径优先级
1 单行导入
import "fmt"
import "sync"
2 多行导入
import("fmt""sync"
)
3 使用别名
我们导入了两个具有同一包名的包时产生冲突,此时这里为其中一个包定义别名
import ("crypto/rand"mrand "math/rand" // 将名称替换为mrand避免冲突
)
我们导入了一个名字很长的包,为了避免后面都写这么长串的包名,可以这样定义别名
import hw "helloworldtestmodule"
防止导入的包名和本地的变量发生冲突,比如 path 这个很常用的变量名和导入的标准包冲突。
import pathpkg "path"
4 使用点操作
如里在我们程序内部里频繁使用了一个工具包,比如 fmt,那每次使用它的打印函数打印时,都要 包名+方法名。
对于这种使用高频的包,可以在导入的时,就把它定义会 “自己人”(方法是使用一个 . ),自己人的话,不分彼此,它的方法,就是我们的方法。
从此,我们打印再也不用加 fmt 了。
import . "fmt"func main() {Println("hello, world")
}
但这种用法,会有一定的隐患,就是导入的包里可能有函数,会和我们自己的函数发生冲突。
5. 包的初始化
每个包都允许有一个或多个的 init 函数,当这个包被导入时,会执行该包的这个 init 函数,做一些初始化任务。
对于 init 函数的执行有两点需要注意
init 函数优先于 main 函数执行
在一个包引用链中,包的初始化是深度优先的。比如,有这样一个包引用关系:main→A→B→C,那么初始化顺序为
C.init→B.init→A.init→main
6. 包的匿名导入
当我们导入一个包时,如果这个包没有被使用到,在编译时,是会报错的。
但是有些情况下,我们导入一个包,只想执行包里的 init 函数,来运行一些初始化任务,此时怎么办呢?
可以使用匿名导入,用法如下,其中下划线为空白标识符,并不能被访问
// 注册一个PNG decoder
import _ "image/png"
由于导入时,会执行 init 函数,所以编译时,仍然会将这个包编译到可执行文件中。
7. 导入的是路径还是包?
当我们使用 import 导入 testmodule/foo 时,初学者,经常会问,这个 foo 到底是一个包呢,还是只是包所在目录名?
import "testmodule/foo"
为了得出这个结论,专门做了个试验(请看「第七点里的代码示例」),最后得出的结论是:
- 导入时,是按照目录导入。导入目录后,可以使用这个目录下的所有包。
- 出于习惯,包名和目录名通常会设置成一样,所以会让你有一种你导入的是包的错觉
8. 相对导入和绝对导入
据我了解在 Go 1.10 之前,好像是不支持相对导入的,在 Go 1.10 之后才可以。
绝对导入:从 $GOPATH/src 或 $GOROOT 或者 $GOPATH/pkg/mod 目录下搜索包并导入
相对导入:从当前目录中搜索包并开始导入。就像下面这样
import ("./module1""../module2""../../module3""../module4/module5"
)
9. 包导入路径优先级
前面一节,介绍了三种不同的包依赖管理方案,不同的管理模式,存放包的路径可能都不一样,有的可以将包放在 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 文件夹中。
参考连接:
微信公众号
go import导入包详解相关推荐
- python导入模块的变量_python 环境变量和import模块导入方法(详解)
1.定义 模块:本质就是.py结尾的文件(逻辑上组织python代码)模块的本质就是实现一个功能 文件名就是模块名称 包: 一个有__init__.py的文件夹:用来存放模块文件 2.导入模块 for ...
- 合法的python变量名import_python 环境变量和import模块导入方法(详解)
1.定义 模块:本质就是.py结尾的文件(逻辑上组织python代码)模块的本质就是实现一个功能 文件名就是模块名称 包: 一个有__init__.py的文件夹:用来存放模块文件 2.导入模块 imp ...
- jenkins插件调用job_Jenkins迁移job插件Job Import Plugin流程详解
Jenkins迁移job插件Job Import Plugin流程详解 由于又开了新机器所以又要重新布置Jenkins从老项目拷贝过来,发现Job Import Plugin 这个插件更新了,和以前的 ...
- 【Intellij IDEA教程】怎么自动清除无效的import导入包、清除无效的import导入包的快捷键
[Intellij IDEA教程]怎么自动清除无效的import导入包.清除无效的import导入包的快捷键 通常在使用Intellij IDEA进行项目开发的时候 Intellij IDEA会自动帮 ...
- rmp包详解和安装httpd②
rmp包详解和安装httpd② 标签(空格分隔):软件包管理 文章目录 rmp包详解和安装httpd② @[toc] 0.RPM包安装文件解析 6.总结 1.rpm包命名规则 2.rpm包安装 1)光 ...
- python 相对导入_Python相对导入机制详解
Google FEB 26TH, 2015 Python相对导入机制详解 这个答案能解释大多关于 relative import,即相对导入的疑惑,讲解十分详尽清晰,算是 SO 上被低估的一个答案. ...
- Python零基础速成班-第14讲-Python处理Excel和Word,使用openpyxl和docx包详解,图表入门
Python零基础速成班-第14讲-Python处理Excel和Word,使用openpyxl和docx包详解,图表入门 学习目标 Python处理Excel(使用openpyxl包).图表入门\ P ...
- android jar 包 意见反馈功能,android重点jar包详解.docx
android重点jar包详解 深入理解View(一):从setContentView谈起 我们都知道?MVC,在Android中,这个?V?即指View,那我们今天就来探探View的究竟.在onCr ...
- java axis2 jar_Java axis2.jar包详解及缺少jar包错误分析
Java axis2.jar包详解及缺少jar包错误分析 一.最小开发jar集 axis2 开发最小jar包集: activation-1.1.jar axiom-api-1.2.13.jar ax ...
- spring2.0和spring2.5及以上版本的jar包区别 spring jar 包详解
spring jar 包详解 spring.jar是包含有完整发布的单个jar包,spring.jar中包含除了 spring-mock.jar里所包含的内容外其它所有jar包的内容,因为只有在开发环 ...
最新文章
- 如何用zendstudio新建一个PHP工程
- 分析Windows和Linux动态库
- ASP.NET MVC3 上传头像图片并截图
- 善于总结所做所学的内容
- 董明珠:我不是要把奥克斯整死 我希望它改邪归正
- additemdecoration重复_安卓中另一个强大的大量数量集控件RecyclerView
- Android控件——TextView,EditText
- 【干货】关于机器学习的知识点,全在这篇文章里了
- linux下代码覆盖率检查工具---gcov的用法
- ai作文批改_有道词典上线AI作文批改功能,可自动批改雅思、四六级作文
- 标签打印软件如何连接标签打印机
- 南航计算机考研是自主命题吗_什么是自主计算?
- LeetCode——二叉树的前中后序遍历
- 正版软件 - AxMath 专业的数学公式编辑器带计算功能 数学公式编辑器首选工具
- Java人工弱智算法_人工智障也刷题!Kaggle 入门之实战泰坦尼克号
- 学Java的四天(在入土的边缘疯狂试探。。。)
- 最新限量红包封面,限时领取!
- 关于window.scroll系列方法汇总 滚动到指定元素位置
- 高级数据操作--联合查询
- Linux高级课程----Linux的例行性工作和chrony服务器