服务计算作业一——安装go语言开发环境
18342138 郑卓民
相关博客链接:
本次作业建立在centos7虚拟机的基础上,关于centos虚拟机的安装及相关问题,可见于以下链接:
系统硬件与操作系统
选择virtualbox下的虚拟机centos7进行实验。
安装VSCode编辑器
centos 7 使用yum安装vscode
- 创建repo文件 vscode.repo,输入以下内容:
[code]
name=Visual Studio Code
baseurl=https://packages.microsoft.com/yumrepos/vscode
enabled=1
gpgcheck=1
gpgkey=https://packages.microsoft.com/keys/microsoft.asc
- 复制文件 vscode.repo 到目录 /etc/yum.repos.d
- 安装vscode
yum makecache
yum install code
安装golang
直接使用命令:sudo yum install golang会出现没有可用软件包的错误,如下:
这代表在linux系统yum源中已经没有对应的安装包了,这时我们需要安装EPEL(Extra Packages for Enterprise Linxu,企业版Linux额外包): yum install -y epel-release
然后使用:sudo yum install golang
即可
安装到哪个目录?rpm -ql golang|more
测试安装:go version
设置环境变量
- 创建工作空间
mkdir $HOME/gowork
- 配置环境变量
# 通过修改.bashrc文件
vim ~/.bashrc
# 在最后面加上下面两句:
export GOPATH=/home/daniel/go # 这是我的设置
export PATH=$PATH:$GOPATH/bin
- 更新配置
source ~/.bashrc
- 检查配置
go env
创建hello world!
创建源代码目录:mkdir $GOPATH/src/github.com/github-user/hello -p
其中github-user对应你的github账户名称
使用 vs code 创建 hello.go:
package main
import "fmt"
func main() {
fmt.Printf("hello, world\n")
}
终端运行
go run hello.go
解决centos7的root账户下无法通过code命令启动vscode
centos7的root账户下无法通过code命令启动vscode:
[root@localhost ~]# code
You are trying to start vscode as a super user which is not recommended. If you really want to, you must specify an alternate user data directory using the --user-data-dir argument.
通过命令行启动code,并打开文件夹:
vim ~/.bashrc
添加以下别名:
alias code='sudo code --user-data-dir="/!:1"'
更新配置:
source ~/.bashrc
安装git客户端
sudo yum install git
安装go的一些工具
此部分安装tools文件库。
- 下载源代码到本地(两种方法)
方法一:
# 创建文件夹
mkdir $GOPATH/src/golang.org/x/
# 下载源码
go get -d github.com/golang/tools
# copy
cp $GOPATH/src/github.com/golang/tools $GOPATH/src/golang.org/x/ -rf
方法二:
直接去https://github.com/golang/tools.git 克隆一份然后放到$GOPATH/src/golang.org/x/tools目录下。
- 安装工具包
go install golang.org/x/tools/go/buildutil
- 安装运行hello world
go install github.com/github-user/hello
hello
安装vscode的go相关扩展
按提示点击安装之后,只有一个问题,最后提示有一个安装包安装失败Installing github.com/ramya-rao-a/go-outline FAILED。然后按照指导页面使用go get -d github.com/golang/tools将源代码下载到本地后安装还是不行。
解决:手动安装
go get -u github.com/ramya-rao-a/go-outline
go install github.com/ramya-rao-a/go-outline
安装与运行go tour
使用示例代码会出现错误,如下:
go get github.com/Go-zh/tour/gotour
gotour
# github.com/Go-zh/tour/gotour has moved to golang.org/x/tour
查看 github.com/Go-zh/tour/gotour/main.go
文件,main输出完该语句就直接退出了。(github上的仓库不再维护了)
解决如下:
此处需要安装的东西有golang/net, yuin/goldmark, gotour
net:
参考网站https://github.com/golang/net 上的做法
The easiest way to install is to run go get -u golang.org/x/net. You can also manually git clone the repository to $GOPATH/src/golang.org/x/net.
goldmark:
参考网站https://github.com/yuin/goldmark 上的做法
go get github.com/yuin/goldmark
gotour:
在码云gotour仓库中下载资源(https://gitee.com/kxmile/gotour)
然后把解压出来的文件中,将src/bitbucket.org复制到$GOPATH/src目录下
然后在$GOPATH/src/bitbucket.org/mikespook/go-tour-zh/gotour下执行go install后运行gotour即可。
可以看到生成的可执行文件放在项目目录的bin文件夹下面:
我的第一个包与测试
第一个库
编写一个库,并让 hello 程序来使用它。
同样,第一步还是选择包路径(我们将使用 github.com/user/stringutil) 并创建包目录:
mkdir $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 build github.com/user/stringutil
确认 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 包也会被自动安装。
运行此程序的新版本,你应该能看到一条新的,反向的信息:
测试
Go拥有一个轻量级的测试框架,它由 go test 命令和 testing 包构成。
你可以通过创建一个名字以 _test.go 结尾的,包含名为 TestXXX 且签名为 func (t *testing.T) 函数的文件来编写测试。 测试框架会运行每一个这样的函数;若该函数调用了像 t.Error 或 t.Fail 这样表示失败的函数,此测试即表示失败。
我们可通过创建文件 $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 运行该测试: