C++的代码的组织,依赖的管理规定几乎为零。学习golang的时候,一上来就是看语法,看代码,在代码组织和依赖管理这里碰了不少壁,所以重新看了一下官方文档,并做下备忘。
注意:Go是跨平台的,本文基于Ubuntu(Linux)。
安装/升级
- 下载最新版的安装包。
- 如果升级,需要先删除旧版本:
rm /usr/local/go
。 - 把解压后的目录安装(复制)到
/usr/local/go
。 - 设置环境变量在
$HOME/.profile
文件中加上export PATH=$PATH:/usr/local/go/bin
。 - 查看你安装的go版本
go version
。 - 更多详细请查看官方文档 。
开始写Go代码
说明
- 在go中,一般把所有代码放在一个workspace(工作空间下)。
- 这个workspace下可能会有很多使用不同版本控制工具的代码仓库。
- 每个仓库有一个到多个package。
- 每个package由一个到多个go源码文件组成。
Workspaces
一个Workspace下有三个目录:
-
src
存放Go源码,包括自己写的代码和import
的第三方代码。 -
pkg
存放包对象——编译后的二进制目标文件。 -
bin
存放可执行文件。
GOPATH
- 环境变量
GOPATH
就是你的workspace的路径。默认是$HOME/go
。注意:GOPATH
不能与go的安装路径相同。 -
go env GOPATH
:查看当前生效的GOPATH的值。 - 为了方便,可以将
$GOPTH/bin
路径加入到$PATH
export PATH=$PATH:$(go env GOPATH)/bin
第一个程序
假设你的代码的base path是github.com/user
。
- 创建你的代码base path:
mkdir -p $GOPATH/src/github.com/user
。 - 创建你的第一个程序的目录:
mkdir -p $GOPATH/src/github.com/user/hello
。 - 在你的程序目录下创建一个源文件
hello.go
package main
import "fmt"
func main() {
fmt.Println("Hello World")
}
- 编译 :
-
go build github.com/user/hello
在当前路径生成可执行文件。 -
go build
在hello目录下执行(下面go install
go test
都类似)。 -
go install github.com/user/hello
在$GOPATH/bin
目录下生成可执行文件。
-
第一个包(package)
- 创建代码路径:
mkdir -p $GOPATH/src/github.com/user/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/user/stringutil
不会生成任何东西,但是如果代码有问题会报错。 - 执行
go install github.com/user/stringutil
在生成二进制目标文件。 - 修改hello.go的代码,让它调用
stringutil.Reverse
package main
import (
"fmt"
"github.com/JinheLin/stringutil"
)
func main() {
fmt.Println(stringutil.Reverse("!oG ,olleH"))
}
- 编译执行
第一个测试
- go提供了一个轻量级测试框架,主要由
go test
命令和package testing
组成。 - go规定测试代码的文件名为
xxx_test.go
:在stringutils下为reverse.go创建一个测试代码文件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, want %q", c.in, got, c.want)
}
}
}
- 执行
go test github.com/user/stringutil
。
总结
- 学习go的安装和相关代码路径环境变量。
- 学习go代码的组织结构。
- 学习go package的基本管理。