GO 包相关

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目录便可
相关文章
相关标签/搜索