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,包名需要加引号,多个包名之间用空行分隔。
import (
"go_sample/practice"
"testing"
_"crypto/aes"
)
go在引入包的时候和java不太一样。在引入包的时候,编译器会使用Go环境变量设置的路径,通过引入的相对路径来查找磁盘上的包。会优先在环境变量GOROOT
配置的目录下去匹配。如果没有匹配上再到GOPATH
配置的目录下去匹配。一旦编译器找到一个满足import 语句的包,就停止进一步查找。
需要注意的是,go中是不允许导入一个没有使用的包的,但是某些时候我们导入包只是为了他能调用包下的init函数(后续会讲到),但是init函数是go自动调用的。在这个时候就可以在包前使用空白标识符”_”。在Go语言里称为空白标识符,有很多用法。这个标识符用来抛弃不想继续使用的值,如给导入的包赋予一个空名字,或者忽略函数返回的你不感兴趣的值。
在go中调用函数是直接通过导入的包名进行调用。假如我们导入的包名有重复改咋办呢,例如:
import (
"network/convert"
"file/convert"
)
go的建议是通过包命名的方式,将上面语句改成
import (
nconvert "network/convert"
fconvert "file/convert"
)
远程导入
todo