本文记录了 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

参考资料