一、Go包管理
我们在使用其他语言,比如Java,是有包的概念的,它是Java语言中组织我们的Java文件的一个概念,比如java.lang这个包,他里面有很多我们常用的类,比如String。在Go语言中,包也是类似的概念,它是把我们的go文件组织起来,可以方便进行归类、复用等目的。 比如Go内置的net包:
net
├── http
├── internal
├── mail
├── rpc
├── smtp
├── testdata
├── textproto
└── url
以上是net包的一个目录结构,net本身是一个包,net目录下的http又是一个包。从这里大家可以看到,go语言的包其实就是我们计算机里的目录,或者叫文件夹,通过它们进行目录结构和文件组织,go只是对目录名字做了一个翻译,叫【包】而已。比如这里的net包其实就是net目录,http包其实就是http目录,这也是go语言中的一个命名习惯,包名和文件所在的目录名是一样的。
2. 包的命名
go语言的包的命名,遵循简洁、全小写、和go文件所在目录同名的原则,这样就便于我们引用,书写以及快速定位查找。
比如go自带的http这个包,它这个http目录下的所有go文件都属于这个http包,所以我们使用http包里的函数、接口的时候,导入这个http包就可以了。
package main
import "net/http"
func main() {
http.ListenAndServe("127.0.0.1:8080",handler);
}
从这个例子可以看到,我们导入的是net/http,这在go里叫做全路径,因为http包在net里面,net是最顶级的包,所以必须使用全路径导入,go编译程序才能找到http这个包,和我们文件系统的目录路径是一样的。
因为有了全路径,所以命名的包名可以和其他库的一样,只要它们的全路径不同就可以了,使用全路径的导入,也增加了给包名命名的灵活性。
对于自己或者公司开发的程序而言,我们一般采用域名作为顶级包名的方式,这样就不用担心和其他开发者包名重复的问题了。
如果你没有自己的域名,怎么办呢?这时候可以使用github.com。干研发这一行的,在github都会有个账号,如果没有赶紧申请一个,这时候我们就可以使用github.com/
作为你的顶级路径了,别人是不会和你重名的。
package main
import "github.com/rujews/tools"
这就是换成github.com命名的方式。
3. main包
当把一个go文件的包名声明为main时,就等于告诉go编译程序,我这个是一个可执行的程序,那么go编译程序就会尝试把它编译为一个二进制的可执行文件。
一个main的包,一定会包含一个main()函数,这种我们也不陌生,比如C和Java都有main()函数,它是一个程序的入口,没这个函数,程序就无法执行。
在go语言里,同时要满足
main
包和包含main()
函数,才会被编译成一个可执行文件。
我们看一个Hello World的Go语言版本,来说明main
包。
package main
import "fmt"
func main() {
fmt.Println("Hello, Golang")
}
假设该go文件叫hello.go,放在$GOPATH/src/hello目录下(补充:自从有了go module后不必一定在此目录下了),那么我们在这个目录下执行go build命令就会生成二进制的可执行文件,在window系统下生成的是hello.exe,在Unix,MAC和Linux下生成的是hello,我们在CMD或者终端里执行它,就可以看到控制台打印的:
Hello, Golang
二进制可执行文件的名字,就是该main包的go文件所在目录的名字,因为hello.go在hello目录下,所以生成的可执行文件就是hello这个名字。