依据 https://pmlpml.gitee.io/service-computing/post/ex-install-go/ 进行配置。

系统硬件与操作系统

系统硬件:LXC 容器形式,分配 8 CPU 核、8 GB 内存、32 G 硬盘
操作系统:Ubuntu 20.04.1 LTS

安装过程

安装 VSCode 编辑器

由于不打算给 LXC 容器部署图形界面,我们就不在这上边安装 VSCode 了。Windows 下 VSCode 安装过程不再赘述(双击安装包点点点)。

安装 golang

本体

一般我们都会采用编译安装(以获得 golang 的最新版本),但这里我们图省事(并且软件源也不算太老),就直接使用包管理器安装了。

  1. sudo apt install golang-go
  2. # 测试一下
  3. go version

image.png

环境变量

  1. # 创建工作空间
  2. mkdir $HOME/gowork
  3. # 临时配置环境变量,如果需要在下次打开 Bash 时也应用,则将下面两行添加到 ~/.bashrc 末尾
  4. export GOPATH=$HOME/gowork
  5. export PATH=$PATH:$GOPATH/bin
  6. # 检查环境变量
  7. go env

image.png

创建 Hello World

  1. # 创建源代码目录
  2. mkdir $GOPATH/src/github.com/robinWongM/go-hello -p

然后使用我喜欢的命令行文本编辑器 nano 创建一个 hello.go ,放置在刚刚创建的源代码目录下。 hello.go 内容如下:

  1. package main
  2. import "fmt"
  3. func main() {
  4. fmt.Printf("hello, world\n")
  5. }

image.png
然后运行 go run hello.go
image.png

安装必要的工具和插件

Git

  1. sudo apt install git
  2. # 测试一下
  3. git version

image.png

安装 Go 的一些工具

原文提供了一种方法,把 go get 换成 go get -dgo install 两步,其中 go get -d 下载的是 github.com 上对应的包源代码,以替代访问有困难的 golang.org,然后再使用本地下载好的代码进行编译安装。但以现在的网络条件去访问 github.com 也稍显困难,所以我们还是用挂代理的方式去解决该问题。

  1. # 设置你的代理
  2. export HTTPS_PROXY=http://your-magic-proxy:port
  3. # 安装 buildutil
  4. go get golang.org/x/tools/go/buildutil
  5. # 检查是否安装
  6. go list ... | grep buildutil

image.png

安装运行 Hello World

刚才我们已经使用 go run 去运行了 hello.go ,这次我们将使用 go install 将编译产物“安装到系统里”(其实就是复制到 $GOPATH/bin),然后在 Bash 里直接执行 go-hello 即可运行。

  1. go install github.com/robinWongM/go-hello
  2. go-hello

image.png

安装与运行 Go Tour

这里的 Go Tour 就是 https://tour.golang.org/ 的本地离线版本。

  1. go get golang.org/x/tour
  2. tour

image.png
在浏览器里打开 http://127.0.0.1:3999 就可以看到离线版的 Go Tour 了。

注:这里我们使用的是远程的 LXC 容器,你可以考虑使用 VS Code Remote SSH 连接到该容器,就可以方便地设置端口转发,将 LXC 容器中的 127.0.0.1:3999 转发到本地机器的 127.0.0.1:3999,之后就可以使用浏览器打开了。或者,如果你可以直接通过 LXC 容器的 IP 去访问 LXC 容器的话,则可以更改 gotour 的源码,将监听地址改为 0.0.0.0,这样你就可以使用 http://:3999 去访问了。

image.png

我的第一个包与测试

依据 https://go-zh.org/doc/code.html,但这篇与最新版的官方文档似乎有出入。

创建一个库并导入

前边的步骤我们已经做过了,所以直接从第一个库开始。

  1. # 创建一个库
  2. mkdir -p $GOPATH/src/github.com/robinWongM/stringutil

然后使用我喜欢的命令行编辑器 nano 在刚才创建的目录下新建文件 reverse.go

  1. package stringutil
  2. func Reverse(s string) string {
  3. r := []rune(s)
  4. for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 {
  5. r[i], r[j] = r[j], r[i]
  6. }
  7. return string(r)
  8. }

然后在那个目录下编译一下( go build )。
image.png
没有报错,我们就胜利了。然后改一下之前的 go-hello ,引入 stringutil 这个包。

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/robinWongM/stringutil"
  5. )
  6. func main() {
  7. fmt.Printf(stringutil.Reverse("!oG ,olleH"))
  8. }

现在再试一试。

  1. go install github.com/robinWongM/go-hello
  2. go-hello

image.png

测试

stringutil 目录下创建 reverse_test.go

  1. package stringutil
  2. import "testing"
  3. func TestReverse(t *testing.T) {
  4. cases := []struct {
  5. in, want string
  6. }{
  7. {"Hello, world", "dlrow ,olleH"},
  8. {"", ""},
  9. }
  10. for _, c := range cases {
  11. got := Reverse(c.in)
  12. if got != c.want {
  13. t.Errorf("Reverse(%q) == %q, want %q", c.in, got, c.want)
  14. }
  15. }
  16. }

之后我们运行 go test github.com/robinWongM/stringutil 就可以测试了:
image.png

问题或要点小结

网络

配置 Golang 遇到的最主要的问题还是网络问题,只要配置好通畅的网络即可。
在使用软件源安装 Go 时,如果你在中山大学校园网内,那么你也可以将你的操作系统软件源配置为 Matrix 镜像站(https://mirrors.vmatrix.org.cn/),这样你可以获得极快的下载速度。配置方法依操作系统而有所不同,请参见镜像站提供的帮助文档。
go get golang.org/x/... 时,你也可以使用 Go Module Proxy 这一特性,通过 goproxy 镜像站(如 goproxy.io, goproxy.cn 等)去下载原先位于 golang.org 的依赖项。但这个方法不适用于 gotour(https://github.com/golang/tour/issues/761)。

相关博客链接

  1. 如何为命令行程序设置代理服务器
  2. 《安装 go 语言开发环境》https://pmlpml.gitee.io/service-computing/post/ex-install-go/
  3. 《干货满满的 Go Modules 和 goproxy.cn》https://juejin.im/post/6844903954879348750