本文记录了 Go 语言入门过程中最基础的四个环节:编写第一个程序、创建工具库、编写单元测试,以及使用远程包。内容基于 Go 1.x 初期的 GOPATH 模式编写。
注意:自 Go 1.11 起引入了模块(Modules)机制,Go 1.16 开始默认启用模块模式,GOPATH 模式已被取代。现在开发新项目应当使用 go mod init 创建模块,而非手动设置 GOPATH。下文示例保留原始风格以作参考。
第一个程序#
安装 Go 的 pkg 包后,需要配置环境变量。建议在用户目录下创建一个 go 文件夹用于开发:
1
2
| export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
|
文档中虽未强制要求这些步骤,但如果不这样做,排查问题会非常痛苦。按照 Go 的约定创建目录结构,方便后续提交代码。在 $GOPATH/src 下创建路径 info.haoxiqiang/first/hello,然后在其中创建 hello.go:
1
2
3
4
5
6
7
| package main
import "fmt"
func main() {
fmt.Printf("hello, go\n")
}
|
要能直接运行,必须保证至少存在一个包名为 main 的包。有三种运行方式:
- 直接运行:
go run hello.go - 编译安装(省略
src 路径):go install info.haoxiqiang/first/hello - 在源码目录直接执行
go install
运行成功不会有任何报错信息,同时在 $GOPATH/bin 中会生成可执行文件。可以进入 bin 目录执行 ./hello,也可以在任意位置执行 $GOPATH/bin/hello。
工具库#
在实际项目中,经常会用到工具类或第三方库。下面展示基本的 Go library 用法。创建目录和源文件:
1
2
| mkdir -p $GOPATH/src/info.haoxiqiang/tool/stringutil
vi util1.go
|
1
2
3
4
5
6
7
8
9
| package stringutil
func Reverse(s string) string {
r := []rune(s)
for i, j := 0, len(s)-1; i < len(s)/2; i, j = i+1, j-1 {
r[i], r[j] = r[j], r[i]
}
return string(r)
}
|
需要注意,包名就是引用时使用的名称。调用方式如下:
1
2
3
4
5
6
7
8
9
10
| package main
import (
"fmt"
"info.haoxiqiang/tool/stringutil"
)
func main() {
fmt.Printf(stringutil.Reverse("123456789\n"))
}
|
单元测试#
Go 自带一个轻量级的测试框架,使用起来非常方便。测试文件建议命名为 xxx_test.go 的格式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| 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)
}
}
}
|
运行测试:
1
2
| go test info.haoxiqiang/tool/stringutil
ok info.haoxiqiang/tool/stringutil 0.005s
|
这种表格驱动测试(table-driven test)是 Go 社区广泛采用的风格,通过定义结构体切片来覆盖多个测试用例,既简洁又易于扩展。
远程包#
Go 原生支持远程包。可以直接获取官方示例:
1
| go get github.com/golang/example/hello
|
这会在本地 $GOPATH/src 下创建对应的目录结构和文件。执行 $GOPATH/bin/hello 就能看到输出 Hello, Go examples!。
同样可以在 import 中直接引用远程包,go get 会自动抓取、构建和安装:
1
2
3
4
| import (
"fmt"
"github.com/golang/example/stringutil"
)
|
1
2
3
| go get info.haoxiqiang/first/hello
go install info.haoxiqiang/first/hello
bin/hello
|
源码:https://github.com/Haoxiqiang/go-practise
参考资料#