文章目录

  • 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"

为了得出这个结论,专门做了个试验(请看「第七点里的代码示例」),最后得出的结论是:

  1. 导入时,是按照目录导入。导入目录后,可以使用这个目录下的所有包。
  2. 出于习惯,包名和目录名通常会设置成一样,所以会让你有一种你导入的是包的错觉

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

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

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

为了验证这个过程,我在创建中创建一个 vendor 目录后,就开启了 vendor 模式了,我在 main.go 中随便导入一个包 pkg,由于这个包是我随便指定的,当然会找不到,找不到就会报错, Golang 会在报错信息中打印中搜索的过程,从这个信息中,就可以看到 Golang 的包查找优先级了。


如果使用 go modules

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

而如果你导入的包没有域名(比如 "fmt"这种),就只会到 $GOROOT 里查找。

还有一点很重要,当你的项目下有 vendor 目录时,不管你的包有没有域名,都只会在 vendor 目录中想找。


通常vendor 目录是通过 go mod vendor 命令生成的,这个命令会将项目依赖全部打包到你的项目目录下的 verdor 文件夹中。
参考连接:
微信公众号

go import导入包详解相关推荐

  1. python导入模块的变量_python 环境变量和import模块导入方法(详解)

    1.定义 模块:本质就是.py结尾的文件(逻辑上组织python代码)模块的本质就是实现一个功能 文件名就是模块名称 包: 一个有__init__.py的文件夹:用来存放模块文件 2.导入模块 for ...

  2. 合法的python变量名import_python 环境变量和import模块导入方法(详解)

    1.定义 模块:本质就是.py结尾的文件(逻辑上组织python代码)模块的本质就是实现一个功能 文件名就是模块名称 包: 一个有__init__.py的文件夹:用来存放模块文件 2.导入模块 imp ...

  3. jenkins插件调用job_Jenkins迁移job插件Job Import Plugin流程详解

    Jenkins迁移job插件Job Import Plugin流程详解 由于又开了新机器所以又要重新布置Jenkins从老项目拷贝过来,发现Job Import Plugin 这个插件更新了,和以前的 ...

  4. 【Intellij IDEA教程】怎么自动清除无效的import导入包、清除无效的import导入包的快捷键

    [Intellij IDEA教程]怎么自动清除无效的import导入包.清除无效的import导入包的快捷键 通常在使用Intellij IDEA进行项目开发的时候 Intellij IDEA会自动帮 ...

  5. rmp包详解和安装httpd②

    rmp包详解和安装httpd② 标签(空格分隔):软件包管理 文章目录 rmp包详解和安装httpd② @[toc] 0.RPM包安装文件解析 6.总结 1.rpm包命名规则 2.rpm包安装 1)光 ...

  6. python 相对导入_Python相对导入机制详解

    Google FEB 26TH, 2015 Python相对导入机制详解 这个答案能解释大多关于 relative import,即相对导入的疑惑,讲解十分详尽清晰,算是 SO 上被低估的一个答案. ...

  7. Python零基础速成班-第14讲-Python处理Excel和Word,使用openpyxl和docx包详解,图表入门

    Python零基础速成班-第14讲-Python处理Excel和Word,使用openpyxl和docx包详解,图表入门 学习目标 Python处理Excel(使用openpyxl包).图表入门\ P ...

  8. android jar 包 意见反馈功能,android重点jar包详解.docx

    android重点jar包详解 深入理解View(一):从setContentView谈起 我们都知道?MVC,在Android中,这个?V?即指View,那我们今天就来探探View的究竟.在onCr ...

  9. 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 ...

  10. spring2.0和spring2.5及以上版本的jar包区别 spring jar 包详解

    spring jar 包详解 spring.jar是包含有完整发布的单个jar包,spring.jar中包含除了 spring-mock.jar里所包含的内容外其它所有jar包的内容,因为只有在开发环 ...

最新文章

  1. 如何用zendstudio新建一个PHP工程
  2. 分析Windows和Linux动态库
  3. ASP.NET MVC3 上传头像图片并截图
  4. 善于总结所做所学的内容
  5. 董明珠:我不是要把奥克斯整死 我希望它改邪归正
  6. additemdecoration重复_安卓中另一个强大的大量数量集控件RecyclerView
  7. Android控件——TextView,EditText
  8. 【干货】关于机器学习的知识点,全在这篇文章里了
  9. linux下代码覆盖率检查工具---gcov的用法
  10. ai作文批改_有道词典上线AI作文批改功能,可自动批改雅思、四六级作文
  11. 标签打印软件如何连接标签打印机
  12. 南航计算机考研是自主命题吗_什么是自主计算?
  13. LeetCode——二叉树的前中后序遍历
  14. 正版软件 - AxMath 专业的数学公式编辑器带计算功能 数学公式编辑器首选工具
  15. Java人工弱智算法_人工智障也刷题!Kaggle 入门之实战泰坦尼克号
  16. 学Java的四天(在入土的边缘疯狂试探。。。)
  17. 最新限量红包封面,限时领取!
  18. 关于window.scroll系列方法汇总 滚动到指定元素位置
  19. 高级数据操作--联合查询
  20. Linux高级课程----Linux的例行性工作和chrony服务器

热门文章

  1. 关于《微习惯》的记录
  2. 洛谷 P5708 三角形面积 C语言
  3. 嵌入式 职位描述 职位要求
  4. css3中vw/vh/vmin/vmax的含义与使用方法
  5. uni-app h5 扫一扫
  6. sge中的windows选项
  7. 互联网公司怪相:一边裁员,一边忙着做慈善
  8. ASP.NET资源大全-知识分享
  9. java时钟时针绘制代码_java实现时钟效果
  10. 为什么Java小伙对JavaScript和Node.js如此兴奋?