Golang中包机制的理解

我们都知道Golang中有package的概念。在go源码文件的第一行就是先声明包名:

package main

这里的包名是一个标签,不是使用字符串。对于简答的项目可以直接使用main作为包名。

在go的开发中,我们会把所有的项目放到GOPATH/src目录下;与其他语言的项目不同,go的约定是(当前用户)所有的所有项目都是放到这个目录;所以这里面会有很多的项目。一般约定使用域名作为一级的目录,比如GOPATH/src/github.com这个目录存放所有从github获取的项目。

golang中的包全名是相对于GOPATH/src/的相对路径加源码文件中的package声明。源码的文件夹目录可以随意组织,可以有多层级目录,比如我打一个项目放在 GOPATH/src/wuxu.bit/example/alg/sort目录下。里面的一个源码文件sort.go如下:

package sort

import "fmt"

func Sort(a []int) {
// do some sort things
// fmt.Println(...)
}

现在另外一个项目要使用这个排序方法,假设那个项目目录是GOPATH/src/wuxu/weather/目录下的main.go文件。那么要在main.go中import排序文件的包,这里要用完整的包名

package main

import (
sort "wuxu.bit/example/alg/sort"
"fmt"
)

func main() {
// can use sort.Sort here
}

上面使用了import包名的别名。

golang在引入包的时候还有一些tricks:

  • import . "fmt" 这样在调用fmt包的导出方法时可以省略fmt
  • import _ "fmt" 这样引入该包但是不引入该包的导出函数,而是为了使用该导入操作的副作用: 调用包里面的init函数

golang的包机制现在还很简单,尤其还没有官方的包依赖解决方案,希望依赖解决能早日出来。