ServiceComputingOnCloud

实验三:按官方文档如何使用Go编程写第一个包,做第一次测试。

17343101 苏祺达

实验准备


创建工作空间,配置环境变量

  在命令行输入如下指令,创建工作环境

mkdir my-go-workspace
mkdir my-go-workspace/src
mkdir my-go-workspace/src/github.com
mkdir my-go-workspace/src/github.com/SYSU101
# 由于 pkg 和 bin 文件夹会由 go 工具自行创建,因此先不用管这两个文件夹

  运行结果:
创建工作环境
  然后执行export GOPATH=$HOME/Desktop/ServiceComputingOnCloud/projects/operation3/my-go-workspace以创建GOPATH环境变量。
  运行结果:
设置环境变量
  这里使用绝对路径太长了,用相对路径可不可以?从笔者为数不多的Go使用经历来看,不可以,会在之后构建包时报错,理由是GOPATH不能为相对路径。

实验内容


创建并安装第一个包

  在$GOPATH/src/github.com/SYSU101下,创建一个名为hello的文件夹,并在该文件下再创建一个名为hello.go的文件,在hello.go里,写入以下代码:

package main

import "fmt"

func main() {
    fmt.Println("Hello, world.\n")
}

  然后使用go install github.com/user/hello命令安装此包,就可以执行$GOPATH/bin/hello运行生成的包啦!
  运行结果:
创建并安装第一个包

创建第一个包并调用它

  创建$GOPATH/src/github.com/SYSU101/stringutil文件夹,并在该文件下面创建stringutil.go文件,在文件中写入如下代码:

// stringutil 包含有用于处理字符串的工具函数。
package stringutil

// Reverse 将其实参字符串以符文为单位左右反转。
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)
}

  修改$GOPATH/src/github.com/SYSU101/hello/hello.go文件,将文件内容修改为:

package main

import (
	"fmt"
	"github.com/user/stringutil"
)

func main() {
	fmt.Printf(stringutil.Reverse("!oG ,olleH"))
}

  执行go install github.com/user/hello命令,构建hello命令,然后执行$GOPATH/bin/hello,就可以看到:
创建并调用包

测试

  在$GOPATH/src/github.com/SYSU101/stringutil文件夹下创建stringutil_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/SYSU101/stringutil运行该测试:
测试