go工程组织规范

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$ ls
hello
~/go/src/github.com/yuxi-o/golang$ git init
Initialized 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/stringutil
cat ~/go/src/github.com/yuxi-o/golang/stringutil/reverse.go 
package stringutil

func 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 main
import (
    "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 stringutil
import "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/stringutil
ok      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/hello
Hello, Go examples!

 

参考:

1. How to write Go Code  https://golang.google.cn/doc/code.html

2. https://golang.google.cn/ 提供go在线测试环境和文档

3. https://golang.google.cn/doc/ go相关文档

4. https://golang.google.cn/pkg/ go标准库

5. go基础学习 coder python修行路

转载于:https://www.cnblogs.com/embedded-linux/p/10878049.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值