GO 包相关

1 包编译,eg: 引用pkgtest包

  • pkgtest包没有任何编译,项目直接导入引用,项目编译时实际是会编译pkgtest并在pkgwindows_386下生成pkgtest.a文件
  • 再编译项目,由于pkgtest已经被编译过,所以不会重新编译
  • 删除pkgwindows_386下生成的pkgtest.a文件,再编译项目,会继续编译pkgtest,重新在pkgwindows_386下生成新的pkgtest.a文件
  • 再编译项目,由于pkgtest已经被编译过,所以不会重新编译
  • 修改pkgtest源码,再编译项目,由于pkgtest发生了变动,pkgtest包会被重新编译,重新在pkgwindows_386下生成新的pkgtest.a文件
  • .a文件对于用户来说,一般没啥用,主要给编译器加速编译用的
  • go install只会检查“参数指定的包所在的GOPATH”内的源码是否有更新,如果有则重新编译。对于依赖的其他GOPATH下的包,如果存在已经编译好的.a文件,则不会再检查源码是否有更新,不会重新编译

2 import包相关

  • import包,编译器会依次从$GOROOTsrc和 $GOPATHsrc去查找包
  • 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目录即可
原文地址:https://www.cnblogs.com/sysnap/p/6875294.html