课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
随着互联网的不断发展,程序员能够接触和学习的编程语言也越来越多了,而今天我们就一起来了解一下,go语言编程中包的导入都有哪些知识需要我们学习。
1.单行导入与多行导入
在Go语言中,一个包可包含多个.go文件(这些文件必须得在同一级文件夹中),只要这些.go文件的头部都使用package关键字声明了同一个包。
2.使用别名
在一些场景下,我们可能需要对导入的包进行重新命名,比如
我们导入了两个具有同一包名的包时产生冲突,此时这里为其中一个包定义别名
我们导入了一个名字很长的包,为了避免后面都写这么长串的包名,可以这样定义别名
防止导入的包名和本地的变量发生冲突,比如path这个很常用的变量名和导入的标准包冲突。
3.使用点操作
如里在我们程序内部里频繁使用了一个工具包,比如fmt,那每次使用它的打印函数打印时,都要包名+方法名。
对于这种使用高频的包,可以在导入的时,就把它定义会"自己人"(方法是使用一个.),自己人的话,不分彼此,它的方法,就是我们的方法。
从此,我们打印再也不用加fmt了。
但这种用法,会有一定的隐患,就是导入的包里可能有函数,会和我们自己的函数发生冲突。
4.包的初始化
每个包都允许有一个或多个的init函数,当这个包被导入时,会执行该包的这个init函数,做一些初始化任务。
对于init函数的执行有两点需要注意
init函数优先于main函数执行
在一个包引用链中,包的初始化是深度优先的。
5.包的匿名导入
当我们导入一个包时,如果这个包没有被使用到,在编译时,是会报错的。
但是有些情况下,我们导入一个包,只想执行包里的init函数,来运行一些初始化任务,此时怎么办呢?
可以使用匿名导入,用法如下,其中下划线为空白标识符,并不能被访问
由于导入时,会执行init函数,所以编译时,仍然会将这个包编译到可执行文件中。
6.导入的是路径还是包?
当我们使用import导入testmodule/foo时,初学者,经常会问,这个foo到底是一个包呢,还是只是包所在目录名?
得出的结论是:
导入时,是按照目录导入。导入目录后,可以使用这个目录下的所有包。
出于习惯,包名和目录名通常会设置成一样,所以会让你有一种你导入的是包的错觉。
7..包导入路径优先级
前面一节,介绍了三种不同的包依赖管理方案,不同的管理模式,存放包的路径可能都不一样,有的可以将包放在GOPATH下,有的可以将包放在vendor下,还有些包是内置包放在GOROOT下。
那么问题就来了,如果在这三个不同的路径下,有一个相同包名但是版本不同的包,我们导入的时候,是选择哪个进行导入呢?
这就需要我们搞懂,在Golang中包搜索路径优先级是怎样的?
这时候就需要区分,是使用哪种模式进行包的管理的。
如果使用govendor
当我们导入一个包时,它会:
先从项目根目录的vendor目录中查找
然后从$GOROOT/src目录下查找
后从$GOPATH/src目录下查找
都找不到的话,就报错。
为了验证这个过程,我在创建中创建一个vendor目录后,就开启了vendor模式了,我在main.go中随便导入一个包pkg,由于这个包是我随便指定的,当然会找不到,找不到就会报错,Golang会在报错信息中打印中搜索的过程,从这个信息中,就可以看到Golang的包查找优先级了。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。