一、工作空间
代码目录结构规划
GOPATH下的src目录是开发程序的主要目录,所有的Go源码都放在这个目录下。
一般的做法是,一个目录一个项目。
例如: $GOPATH/src/mymath,表示“mymath”这个应用包或者可执行应用,这个根据package是main还是其他来决定,main的话就是可执行应用,其他的话就是应用包。
所以,当新建应用或者一个代码包时都是在src目录下新建一个文件夹,文件夹名称一般是代码包名称,当然也允许多级目录,例如在src下面新建了目录$GOPATH/src/github.com/a/b,那么这个包路径就是"github.com/a/b",包名称是最后一个目录b。
新建应用包
# cd $GOPATH/src
# mkdir mymath
# touch sqrt.go
# vi sqrt.go
输入如下内容:
package mymath
func Sqrt (x float64) float 64 {
z := 0.0
for i := 0; i < 1000; i ++ {
z -= (z * z - x) / (2 * x)
}
return z
}
编译安装应用包
有两种方式可以编译安装应用包:
1、进入对应的应用包目录,然后执行 go install,即可;
2、在任意的目录下,执行 go install mymath,即可;
# go install
安装完成后,进入如下目录
# cd $GOPATH/pkg/${GOOS}_${GOARCH}
可以看到生成如下文件:mymath.a,这个文件是应用包。
新建可执行应用
# cd $GOPATH/src
# mkdir mathapp
# cd mathapp
# touch main.go
# vi main.go
输入如下内容:
package main
import (
"fmt"
"mymath"
)
func main() {
fmt.Printf("Hello World. Sqrt(2) = %v\n", mymath.Sqrt(2))
}
可以看到import里面调用的应用包是mymath,这个就是相对于 $GOPATH/src 的路径,如果是多级目录,就在import里面引入多级目录,如果你有多个GOPATH也是一样的处理,Go会自动在多个 $GOPATH/src 中寻找。
编译可执行应用包
# go bulid
那么,在该目录下生成一个 mathapp 的可执行文件。
执行应用
# ./mathapp
打印内容:Hello World. Sqrt(2) = 1.414213562373095
二、获取远程包
go语言有一个获取远程包的工具就是go get,目前go get支持多数开源社区(例如:github、googlecode、bitbucket、Launchpad)。
# go get -u github.com/astaxie/beedb
go get -u 参数可以自动更新包,而且当go get的时候会自动获取该包依赖的其他第三方包。
通过这个命令可以获取相应的源码,对应的开源平台采用不同的源码控制工具,例如github采用git、googlecode采用hg,所以要想获取这些源码,必须先安装相应的源码控制工具。
go get本质上可以理解为首先第一步是通过源码工具clone代码到src下面,然后执行go install。
在代码中引用远程包
在代码中如何使用远程包,很简单的就是和使用本地包一样,只要在开头import相应的路径就可以。如:
import "github.com/astaxie/beedb"
三、程序的整体结构
通过上面建立的例子,我本地的gopath目录结构如下所示。
bin/
mathapp
pkg/
平台名/ 如:darwin_amd64、linux_amd64
mymath.a
github.com/
astaxie/
beedb.a
src/
mathapp/
main.go
mymath/
sqrt.go
github.com/
astaxie/
beedb/
beedb.go
util.go
从上面的结构我们可以清晰的看到,bin目录下存放的是编译之后可执行的文件,pkg目录下存放是的应用包,src目录下存放的是应用源代码。