1 包编译,eg: 引用pkgtest包windows
- pkgtest包没有任何编译,项目直接导入引用,项目编译时实际是会编译pkgtest并在pkg\windows_386下生成pkgtest.a文件
- 再编译项目,因为pkgtest已经被编译过,因此不会从新编译
- 删除pkg\windows_386下生成的pkgtest.a文件,再编译项目,会继续编译pkgtest,从新在pkg\windows_386下生成新的pkgtest.a文件
- 再编译项目,因为pkgtest已经被编译过,因此不会从新编译
- 修改pkgtest源码,再编译项目,因为pkgtest发生了变更,pkgtest包会被从新编译,从新在pkg\windows_386下生成新的pkgtest.a文件
- .a文件对于用户来讲,通常没啥用,主要给编译器加速编译用的
- go install只会检查“参数指定的包所在的GOPATH”内的源码是否有更新,若是有则从新编译。对于依赖的其余GOPATH下的包,若是存在已经编译好的.a文件,则不会再检查源码是否有更新,不会从新编译
2 import包相关函数
- import包,编译器会依次从$GOROOT\src和 $GOPATH\src去查找包
- import包也支持相对路径,好比import "./model" //当前文件同一目录的model目录,可是不建议这种方式import
- 包的别名操做,能够把包命名成另外一个用起来容易记忆的名字,好比import f "fmt" 而后这样调用f.Println("xxx"),这样能够解决不一样路径下同名包的名字冲突问题
- 包的匿名导入,好比import _ "image/png", _操做其实只是引入该包。当导入一个包时,它全部的init()函数就会被执行,但有些时候并不是真的须要使用这些包,仅仅是但愿它的init()函数被执行而已。若是不是匿名导入,则须要使用包,不然会报“unused import”编译错误,为了抑制这种错误,就须要匿名导入包
- import包的初始化,当一个包被导入时,若是该包还导入了其它的包,那么会先将其它包导入进来,而后再对这些包中的包级常量和变量进行初始化,接着执行init函数(若是有的话),依次类推。等全部被导入的包都加载完毕了,就会开始对main包中的包级常量和变量进行初始化,而后执行main包中的init函数(若是存在的话),最后执行main函数。注: 一个包能够由多个.go文件组成,每一个go文件均可以有一个init函数进行初始化
3 GOPATH工具
- GOPATH环境变量用于指定这样一些目录:除$GOROOT以外的包含Go项目源代码和二进制文件的目录。go install和go 工具会用到GOPATH:做为编译后二进制的存放目的地和import包时的搜索路径。
- 通常的,一个Go项目在GOPATH下,会有三个目录(bin,pkg,src)其中,bin存放编译后的可执行文件;pkg存放编译后的包文件,通常是.a文件;src存放项目源文件。通常,bin和pkg目录能够不建立,go命令会自动建立(如 go install),只须要建立src目录便可