go编码以workspace形式管理,一个workspace包含所有的Go编码,包含多个版本控制仓库(例如使用git管理的多个仓库)。每个仓库包含多个包package,每个package是一个单独的路径,包含所有go源码,包的路径就是包的导入路径(import path)。
Workspace
Workspace作为根目录,包含两个目录src和bin。bin包含可执行文件,src包含源码。典型的src包含多个版本控制仓库(记录源码开发过程)。形如:
上面的workspace包含两个仓库example和image。example包含两个命令(或包,hello和outyet)和一个库(或包,stringutil)。
$GOPATH指向当前的Workspace。
包的导入路径(import path),指定一个包在workspace或远程仓库的位置。标准库的导入路径可以简写,如“fmt”和“net/http”。但自有库的包的导入路径应该是绝对路径(src下级路径开始),包含基础路径(如:github.com/user)。可通过go help importpath获取更多导入路径的信息。
go源码的第一有效行(注释行除外)必须是
package name
name是导入路径(import path)的默认包名。在一个包中所有文件必须用相同包名,惯例:导入路径名的最后一项应与包名相同,以方便识别和记忆,不出错。
一个程序只有一个main包,一个包中只能有一个main函数,不能重复定义。
对一个可执行程序,不要求package名唯一,但要求导入路径唯一(即可明确确认一个包)。
go程序导出名字
在 Go 中,任何以大写字母开头的变量或者函数都是被导出的名字。其它包只能访问被导出的函数和变量。
同一个包中,所有变量和函数都可调用,无论首字母是否大小写。
first程序
用自己的github账号创建仓库路径:$GOPATH/src/github.com/yuxi-o/golang,此目录下创建包目录hello,然后在hello目录下创建hello.go程序。
目前hello.go路径为:src/github.com/yuxi-o/golang/hello/hello.go。
现在运行如下命令安装hello.go程序:
$go install github.com/yuxi-o/golang/hello
注意:go install或go build执行的路径为package路径,可执行程序名为包路径名。
可采用git管理yuxi-o/golang仓库,在golang目录下:
~/go/src/github.com/yuxi-o/golang$ lshello~/go/src/github.com/yuxi-o/golang$ git initInitialized empty Git repository in /home/wang/go/src/github.com/yuxi-o/golang/.git/~/go/src/github.com/yuxi-o/golang$ git add .~/go/src/github.com/yuxi-o/golang$ git commit -m "first go program"[master (root-commit) bd2635a] first go program 1 file changed, 6 insertions(+) create mode 100644 hello/hello.go
first库
mkdir $GOPATH/src/github.com/yuxi-o/golang/stringutilcat ~/go/src/github.com/yuxi-o/golang/stringutil/reverse.go package stringutilfunc Reverse(s string) string { r := []rune(s) for i,j := 0, len(r)-1; i< len(r)/2; i,j= i+1, j-1 { r[i], r[j] = r[j], r[i] } return string(r)}$ go build github.com/yuxi-o/golang/stringutil
注:go build编译库不会输出文件,保存编译包到local build cache。
cat ~/go/src/github.com/yuxi-o/golang/hello/hello.go package mainimport ( "fmt" "github.com/yuxi-o/golang/stringutil")func main() {// fmt.Println("Hello, Go world") fmt.Println(stringutil.Reverse("!oG, olleH"))}$go install github.com/yuxi-o/golang/hello
现在目录如下:
go测试
go提供轻量级测试框架,包含go test和testing package。
go测试文件命令为_test.go,测试函数定义:func TestXXX(t *testing.T)。test框架运行每个测试函数。假如测试失败,返回t.Error或t.Fail。
cat ~/go/src/github.com/yuxi-o/golang/stringutil/reverse_test.go package stringutilimport "testing"func TestReverse(t *testing.T) { cases := []struct { in, want string }{ { "Hello, world", "dlrow ,olleH"}, { "Hello, 世界", "界世 ,olleH"}, { "", ""}, } for _, c := range cases { got := Reverse(c.in) if got != c.want { t.Errorf("Reverse(%q) == %q, wang %q", c.in, got, c.want) } }}$ go test github.com/yuxi-o/golang/stringutilok github.com/yuxi-o/golang/stringutil 0.002s
Remote包
导入路径可以描述怎样获取package源码(通过git或mercurial)。go get可以fetch、build和install包,若包不存在,go get会下载包到第一个workspace。可下载golang/example测试:
$ go get github.com/golang/example/hello$ $GOPATH/bin/helloHello, Go examples!
参考:
1.
2. 提供go在线测试环境和文档
3. go相关文档
4. go标准库
5.