Go语言的程序都会组织成若干组文件,每组文件被称为一个包。包作为很小的复用单元,被其他项目引用。

包命名

包的定义和java类似,go文件的第一行需要声明自己所属的包,且同一个目录下的所有.go文件必须声明同一个包名。但与java相比有的点不同:

  • java中包名必须和java文件的相对路径保持一致,例如对于java/lang目录下的java文件,包名必须是package java.lang。但是go包名命名没这么严格,不需要和路径保持一致,惯例是使用包所在父级目录的名字,即package lang。不遵循这个规范也能正常运行,但是在引用这个包名就没法通过目录名称直接定位到包名。

main 包

在Go语言里,命名为main的包具有特殊的含义。Go语言的编译程序会试图把这种名字的包编译为二进制可执行文件。所有用Go语言编译的可执行程序(注意是可执行文件)都必须有一个名叫main的包,并且在main的包需要有名为main() 的函数,否则不会生成可执行文件。编译时会使用声明main 包的代码所在的目录的目录名作为二进制可执行文件的文件名。

包导入

导入包需要使用关键字import,包名需要加引号,多个包名之间用空行分隔。

  1. import (
  2. "go_sample/practice"
  3. "testing"
  4. _"crypto/aes"
  5. )

go在引入包的时候和java不太一样。在引入包的时候,编译器会使用Go环境变量设置的路径,通过引入的相对路径来查找磁盘上的包。会优先在环境变量GOROOT配置的目录下去匹配。如果没有匹配上再到GOPATH配置的目录下去匹配。一旦编译器找到一个满足import 语句的包,就停止进一步查找。

需要注意的是,go中是不允许导入一个没有使用的包的,但是某些时候我们导入包只是为了他能调用包下的init函数(后续会讲到),但是init函数是go自动调用的。在这个时候就可以在包前使用空白标识符”_”。在Go语言里称为空白标识符,有很多用法。这个标识符用来抛弃不想继续使用的值,如给导入的包赋予一个空名字,或者忽略函数返回的你不感兴趣的值。

在go中调用函数是直接通过导入的包名进行调用。假如我们导入的包名有重复改咋办呢,例如:

  1. import (
  2. "network/convert"
  3. "file/convert"
  4. )

go的建议是通过包命名的方式,将上面语句改成

  1. import (
  2. nconvert "network/convert"
  3. fconvert "file/convert"
  4. )

远程导入

todo