导入包:
- 标准包使用的是给定的短路径,如"fmt"、"net/http"
- 本身的包,须要在工做目录(GOPATH)下指定一个目录,improt 导入包,实际上就是基于工做目录的文件夹目录
导入包的多种方式:
- 直接根据$GOPATH/src目录导入import "test/lib"(路径实际上是$GOPATH/src/test/lib)
- 别名导入:import alias_name "test/lib" ,这样使用的时候,能够直接使用别名
- 使用点号导入:import . "test/lib",做用是使用的时候直接省略包名
- 使用下划线导入:improt _ "test/lib",该操做其实只是引入该包。当导入一个包时,它全部的init()函数就会被执行,但有些时候并不是真的须要使用这些包,仅仅是但愿它的init()函数被执行而已。这个时候就可使用_操做引用该包。即便用_操做引用包是没法经过包名来调用包中的导出函数,而是只是为了简单的调用其init函数()。每每这些init函数里面是注册本身包里面的引擎,让外部能够方便的使用,例如实现database/sql的包,在init函数里面都是调用了sql.Register(name string, driver driver.Driver)注册本身,而后外部就可使用了。
- 相对路径导入 import "./model" //当前文件同一目录的model目录,可是不建议这种方式import
包的导入过程说明:
程序的初始化和执行都起始于main包。若是main包还导入了其它的包,那么就会在编译时将它们依次导入。有时一个包会被多个包同时导入,那么它只会被导入一次(例如不少包可能都会用到fmt包,但它只会被导入一次,由于没有必要导入屡次)。当一个包被导入时,若是该包还导入了其它的包,那么会先将其它包导入进来,而后再对这些包中的包级常量和变量进行初始化,接着执行init函数(若是有的话),依次类推。等全部被导入的包都加载完毕了,就会开始对main包中的包级常量和变量进行初始化,而后执行main包中的init函数(若是存在的话),最后执行main函数。下图详细地解释了整个执行过程:html

注意:
import 导入 Go 包有几种方式,用途不一样。 代码统一存储在工做目录下,工做目录里边会有不少个包,不一样包按目录组织,包下面由多个代码文件组成。导入包时按包的惟一路径进行导入,导入的包默认是必需要使用,若是不使用则编译失败,须要移除,减小没必要要代码的引入,固然还有其余使用场景。默认状况下,咱们使用文件名作为包名,方便理解。不一样包组织不一样的功能实现,方便理解。golang
编译时使用的是包源码仍是.a?
一个非main包在编译后会生成一个.a文件(在临时目录下生成,除非使用go install安装到$GOROOT或$GOPATH下,不然你看不到.a),用于后续可执行程序连接使用。好比Go标准库中的包对应的源码部分路径在:$GOROOT/src,而标准库中包编译后的.a文件路径在$GOROOT/pkg/darwin_amd64下。一个奇怪的问题在我脑壳中升腾起来,编译时,编译器到底用的是.a仍是源码?sql
- 在使用第三方包的时候,当源码和.a均已安装的状况下,编译器连接的是源码。而所谓的使用第三方包源码,其实是连接了以该最新源码编译的临时目录下的.a文件而已。
- Go标准库中的包也是这样么?对于标准库,好比fmt而言,编译时,到底使用的时$GOROOT/src下源码仍是$GOROOT/pkg下已经编译好的.a呢?不过与自定义包不一样的是,即使你修改了fmt包的源码(未从新编译GO安装包),用户源码编译时,也不会尝试从新编译fmt包的,依旧只是在连接时连接已经编译好的fmt.a
Go语言中import后面路径中最后的一个元素究竟是包名仍是路径名?
- import后面的最后一个元素应该是路径,就是目录,并不是包名。可是不少时候,这个路径名字和包名字相同
- import m "lib/math" m指代的是lib/math路径下惟一的那个包 ,编译器在这个路径下若是发现了两个包,是不容许的,编译报错
一、https://yushuangqi.com/blog/2016/understanding-golang-import-package.html函数
二、https://blog.csdn.net/zhangzhebjut/article/details/25564457spa
三、https://tonybai.com/2015/03/09/understanding-import-packages/.net