【服务计算】一 安装 go 语言开发环境指南
系统硬件与操作系统
按照实验要求,以上面的环境为宿主机,使用虚拟机进行go语言开发环境的安装。
环境准备
- 安装虚拟机软件VirtualBox,本指南采用的是VirtualBox 6.1.2 r135665 (Qt5.6.2)。
- 下载Ubuntu20.04的iso文件。
- 使用VirtualBox创建一个新的Linux虚拟机,并用下载到的Ubuntu20.04的iso文件引导启动并安装操作系统到虚拟磁盘上。
- 在Ubuntu20.04虚拟机下安装git和VS Code。
- 用"sudo apt-get update"升级Ubuntu的apt管理工具到最新版本(为了有比较快的下载速度,可以考虑切换到清华镜像,参考https://mirror.tuna.tsinghua.edu.cn/help/ubuntu/)
安装golang
安装
如果已经安装了golang,首先需要卸载旧版的golang。
由于实验环境下还没有安装golang,因此直接考虑golang的安装。
采用Ubuntu下的软件管理工具apt安装。
sudo apt-get install golang-go
检查golang环境的安装位置:
验证是否已经成功安装:
可以看到已经成功安装。
设置环境变量
根据如何使用Go编程
go 工具为公共代码仓库中维护的开源代码而设计。 无论你会不会公布代码,该模型设置工作环境的方法都是相同的。
Go代码必须放在工作空间内。它其实就是一个目录,其中包含三个子目录:
src 目录包含Go的源文件,它们被组织成包(每个目录都对应一个包),
pkg 目录包含包对象,
bin 目录包含可执行命令。
go 工具用于构建源码包,并将其生成的二进制文件安装到 pkg 和 bin 目录中。
src 子目录通常包会含多种版本控制的代码仓库(例如Git或Mercurial), 以此来跟踪一个或多个源码包的开发。
可以了解到go 对编译、包管理、测试、部署、运行提供全程支持,了解到go的工作空间的结构和意义。
创建工作空间
配置环境变量
对于unbuntu, 在 ~/.profile 文件中添加:
export GOPATH=$HOME/gowork
export PATH=$PATH:$GOPATH/bin
然后执行上述配置
检查配置
说明已经成功配置
创建 hello world!
接触任何一门新的语言,自然要先熟悉该语言的hello world了。
首先退出当前用户,然后重新登录。
创建源代码目录
在Bash下执行:
mkdir $GOPATH/src/github.com/github-user/hello -p
上面的代码创建了源代码目录
编辑代码
使用 vs code 创建 hello.go
package main
import "fmt"
func main() {
fmt.Printf("hello, world\n")
}
其中,import "fmt"表示导入依赖。fmt为go自带的依赖。
func main(){}定义了项目的主函数,类似于C语言的主函数。
fmt.Printf为打印输出函数。
运行
可见可以正常运行hello world,输出了正确结果。
安装必要的工具和插件
安装 Git 客户端
go 语言的插件主要在 Github 上,安装 git 客户端非常重要。
sudo apt-get install git
安装 go 的一些工具
打开 vscode ,其会提示要安装一些工具。但由于golang.org可能连不上,可能会安装失败。
为了解决这个问题,需要手动安装。
下载源代码到本地
# 创建文件夹
mkdir $GOPATH/src/golang.org/x/ -p
# 下载源码
go get -d github.com/golang/tools
# copy
sudo cp $GOPATH/src/github.com/golang/tools $GOPATH/src/golang.org/x/ -rf
之后可以看到需要的源代码文件被下载到了本地。
安装工具包
go install golang.org/x/tools/go/buildutil
可以看到上面成功执行了安装命令。
之后退出 vscode,再进入,按提示继续安装。
如果上面的方法不成功,还可以在命令行使用github上的镜像文件手动安装。
go get -u -v github.com/nsf/gocode
go get -u -v github.com/rogpeppe/godef
go get -u -v github.com/golang/lint/golint
go get -u -v github.com/lukehoban/go-find-references
go get -u -v github.com/lukehoban/go-outline
go get -u -v sourcegraph.com/sqs/goreturns
go get -u -v golang.org/x/tools/cmd/gorename
go get -u -v github.com/tpng/gopkgs
go get -u -v github.com/newhook/go-symbols
之后查看 go 当前工作空间的目录结构,应该和官方文档如何使用Go编程的工作空间一致。
安装运行 hello world
go get github.com/go/hello
go install github.com/go/hello
hello
可以看见成功安装了包,并产生了正常的运行结果。
安装与运行 go tour
发现按照老师文档中的命令执行,会提示上面的路径失效信息。需要修改下命令。
git clone https://gitee.com/kxmile/gotour.git
可以运行上面的命令将gitee上存储的gotour项目clone到本地。
在本地安装后,可以有下面的运行结果。
说明gotour可以成功运行。
用浏览器打开127.0.0.1:3999,可以看到下面的界面。
说明gotour安装成功。
我的第一个包与测试
第一个包
编写一个库,并让 hello 程序来使用它。
第一步选择包路径(这里使用 github.com/user/stringutil) 并创建包目录:
mkdir -p $GOPATH/src/github.com/user/stringutil
接着,在该目录中创建名为 reverse.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)
}
现在用 go build 命令来测试该包的编译:
这不会产生输出文件。想要输出的话,必须使用 go install 命令,它会将包的对象放到工作空间的 pkg 目录中。
确认 stringutil 包构建完毕后,修改原来的 hello.go 文件(它位于 $GOPATH/src/github.com/user/hello)去使用它:
package main
import (
"fmt"
"github.com/user/stringutil"
)
func main() {
fmt.Printf(stringutil.Reverse("!oG ,olleH"))
}
无论是安装包还是二进制文件,go 工具都会安装它所依赖的任何东西。
因此之后执行
go install github.com/user/hello
来安装 hello 程序时,stringutil 包也会被自动安装。
运行此程序的新版本,你应该能看到一条新的,反向的信息:
可以看到,运行结果正常。
第一个测试
我们可通过创建文件 $GOPATH/src/github.com/user/stringutil/reverse_test.go 来为 stringutil 添加测试,其内容如下:
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 运行该测试:
可以看到通过了测试。
如果当前Shell目录不在需要测试的目录下,也可以使用绝对路径指定测试的包:
go test github.com/user/stringutil
实验中遇到的问题
实验中遇到的问题主要是,实验指导中的一些命令过时了,需要采用更新版本的命令。同时,golang.org等网站无法直接连上,需要采取一定的方法或通过其他的资源镜像来进行环境的安装和配置。由于一些资源的路径有所变动,也需要搜索新的资源路径来进行下载和安装。
小结
这次实验,我熟悉了在Ubuntu环境下配置Go环境的步骤与过程。我了解熟悉了go的常用命令如go install, go test, go build, go get等用法。我也进一步熟悉了go中工作空间,包,测试的概念。通过阅读和编写Go语言的hello world和教学指导中的第一个包和测试的代码,我也初步了解学习了Go语言的语法。此外,我也了解和安装好了gotour,可以在之后通过gotour进一步自己学习掌握Go语言的基础知识。