Go 中的包
go语言的包
其实就是我们计算机里的目录,或者叫文件夹,通过它们进行目录结构和文件组织
1 包的命名
go语言的包的命名,遵循简洁
、小写
、和go文件所在目录同名
的原则,这样就便于我们引用,书写以及快速定位查找。
D:\go\src\xxxx\包名 (from $GOROOT)
D:\goprojects\xxx\包名 (from $GOPATH)
对于自己或者公司开发的程序而言,我们一般采用域名作为顶级包名的方式,这样就不用担心和其他开发者包名重复的问题了,以自己定义的名字作为全路径中的最顶层部分
2 main包
在go语言里,同时要满足 main包 和 包含main()函数,才会被编译成一个可执行文件。
当把一个go文件的包名声明为main时,就等于告诉go编译程序,我这个是一个可执行的程序,那么go编译程序就会尝试把它编译为一个二进制的可执行文件。
一个main的包,一定会包含一个main()函数,这种我们也不陌生,比如C和Java都有main()函数,它是一个程序的入口
,没这个函数,程序就无法执行。
3 导入包
import关键字
来导入一个包,这个关键字告诉Go编译器到磁盘的哪里去找要想导入的包,所以导入的包必须是一个全路径的包,也就是包所在的位置。
import "fmt"
import (
"fmt"
"time"
)
包的查找
,是有优先级的
编译器会 优先在GOROOT里搜索,其次是GOPATH,一旦找到,就会马上停止搜索。如果最终都没找到,就报编译异常了。
远程包导入
improt "xxxxgithub.com/A/B"
前提必须是该包 托管在一个 分布式的版本控制系统上,比如Github、Bitbucket等,并且是 Public的权限,可以让我们直接访问它们。
编译在导入它们的时候,会先在GOPATH下
搜索这个包,如果没有找到,就会使用 go get
工具从版本控制系统(GitHub)获取,并且会把获取到的 源代码存储在GOPATH目录下对应URL
的目录里,以供编译使用。
go get 工具
可以递归获取依赖包,如果github.com/spf13/cobra也引用了其他的远程包,该工具可以一并下载下来。
包导入的重命名
在使用import关键字导入包之后,我们就可以在代码中通过包名使用该包下相应的函数、接口等,Go语言可以让我们对导入的包重新命名,这就是命名导入
import (
"fmt"
myfmt "mylib/fmt" // 重新命名
)
导入不使用的包
Go语言规定,导入的包必须要使用,否则会包编译错误
==>> import (
_ "fmt" // 用空白标志符号 这样包就不能再使用了
)
4 包的init函数
Go语言为了统一关于数据库的访问,使用databases/sql抽象了一层数据库的操作,可以满足我们操作MYSQL、Postgre等数据库, 这样不管我们使用这些数据库的哪个驱动,编码操作都是一样的,想换驱动的时候,就可以直接换掉,而不用修改具体的代码。
package mysql
import (
"database/sql"
)
func init() { // 实现mysql连接的初始化操作
sql.Register("mysql", &MySQLDriver{})
}
import "database/sql"
import _ "xxx / xxx / mysql" // 只是想执行这个mysql包的init方法,并不想使用这个包,所以我们在导入这个包 的时候, 需要使用_重命名包名,避免编译错误。
剩下针对的数据库的操作,都是使用的database/sql标准接口,如果我们想换一个mysql的驱动的话,只需要换个导入就可以了,灵活方便,这也是面向接口编程的便利。