Jiahonzheng's Blog

安装 Go 开发环境

字数统计: 2.1k阅读时长: 9 min
2019/09/12 Share

项目地址:github.com/Jiahonzheng/hello

想起来,我使用 Golang 已经有两年了,期间也开发了几个线上环境的应用,并投入了正式使用。总体来说,Golang 的开发流程和运行体验还是很让人满意的。

由于课程作业的原因,我得完成这篇关于如何安装 Go 开发环境的“博客”,想想还是有些滑稽 :)。

实验环境

  • Ubuntu 18.04 LTS

安装过程

gvm

我们使用 gvm 安装 Go 开发环境。gvm 是一个很好用的 Go 多版本管理工具,可以很方便地安装不同的 Go 版本,很贴切生产的需要。

项目 GitHub 仓库: github.com/moovweb/gvm

1
2
# 安装 gvm ,随后需要关闭当前终端,新建终端完成后续操作
bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)

由于 Go 在 1.5 及其以后的版本使用了 Bootstrap 自举机制,即用 Go 编译生成 Go 的编译器,故我们需要下载并安装 go1.4Binary 版本,然后基于 Go 1.4 编译构建 go 1.13.5

1
2
3
4
5
6
7
8
# 下载 Go 1.4 的 Binary 二进制版本,省去安装编译环境的麻烦
gvm install go1.4 -B
# 使用 Go 1.4 作为构建环境
gvm use go1.4
# 设置自举环境变量
export GOROOT_BOOTSTRAP=$GOROOT
# 安装需要自举的 Go 版本
gvm install go1.13

在本机执行上述命令,运行结果如下。

由上图所示,我们已成功使用 gvm 安装 Go 1.13 ,同时我们可以看到 GOPATH/home/jiahonzheng/.gvm/pkgsets/go1.13/global

科学上网

在使用 gvm 下载二进制包或者源码包时,可能会出现网络中断的问题,这是因为我们的终端无法进行科学上网。在已有代理的情况下,我们只需添加几行命令,即可实现终端的科学上网。

我们在 ~/.profile 添加 proxyunproxyalias ,这样在终端启动后,我们即可使用 proxyunproxy 命令来开启和关闭终端科学上网的功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 在 ~/.profile 添加,也可在 .bashrc 等配置文件添加
function proxy {
proxy_url='socks5://127.0.0.1:1080'
export http_proxy=$proxy_url
export https_proxy=$proxy_url
export all_proxy=$proxy_url
}
function unproxy {
unset http_proxy
unset https_proxy
unset all_proxy
}

# 使配置生效
source ~/.profile

# 开启终端科学上网
proxy
# 关闭终端科学上网
unproxy

.profile 进行更改后,我们可通过 curl ip.sb 查看开启 proxy 的本机外网地址。

1
2
3
4
# 开启终端科学上网
proxy
# 获取外网地址,如果为 VPS 地址,即设置成功
curl ip.sb

以下是上述命令的执行结果,由于输出的 IP 地址和 VPS 地址相同,故我们的终端现可科学上网。

git

由于 Go 的插件主要在 Github 上,故安装 git 客户端是很有必要的。我们通过执行以下命令,安装 git 客户端。

1
sudo apt install git

Visual Studio Code

Visual Studio Code 是一个全平台的多语言软件开发工具,使用 JavaScript 开发,我们可以使用其开发 Golang 应用程序。

PS:其实,我并不怎么推荐使用 Visual Studio Code 开发 Golang 程序,因为 Language Server 经常宕机,导致自动提示和补全无法正常工作。如果你是真的想用 Golang 写线上应用程序,那我强烈推荐你使用 JetBrains GoLand ,足够专业,足够可靠。

为了安装 VSCode ,我们现下载 deb 包,下载地址貌似是固定的,为 https://go.microsoft.com/fwlink/?LinkID=760868 。在下载完毕后,我们使用 dpkg 进行安装。

1
2
curl -o code.deb -L https://go.microsoft.com/fwlink/?LinkID=760868
sudo dpkg -i code.deb

执行上述命令,我们即可完成 VSCode 的安装。

值得注意的是,如果在执行 dpkg 出现 dpkg status database is locked by another process 的问题,这是因为包管理器没有正确关闭,可执行以下命令修复问题。

1
sudo rm /var/lib/dpkg/lock

Go Tools

为了能够愉快地在 VSCode 开发 Golang 程序,我们需要安装相关的工具链,我们在 Extensions 页面(Ctrl + Shift + X)输入 Go 关键字,随后找到 Microsoft 出品的 Go 插件并安装。

我们需要安装如上图所示的插件,同时我们需要把 GOROOTGOPATH 设置到 User Settings

下面,我们进行 Go Tools 的安装,这里提供了两种方案。

方案一

为了安装 Go Tools ,我们需要开启终端的科学上网功能(因为 golang.org 被墙了),随后安装 Go Tools 依赖,依赖列表可见官方 Wiki

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 开启终端科学上网功能
proxy
# 安装 Go Tools
# https://github.com/Microsoft/vscode-go/wiki/Go-tools-that-the-Go-extension-depends-on
go get -u -v github.com/ramya-rao-a/go-outline
go get -u -v github.com/acroca/go-symbols
go get -u -v github.com/mdempsky/gocode
go get -u -v github.com/rogpeppe/godef
go get -u -v golang.org/x/tools/cmd/godoc
go get -u -v github.com/zmb3/gogetdoc
go get -u -v golang.org/x/lint/golint
go get -u -v github.com/fatih/gomodifytags
go get -u -v golang.org/x/tools/cmd/gorename
go get -u -v sourcegraph.com/sqs/goreturns
go get -u -v golang.org/x/tools/cmd/goimports
go get -u -v github.com/cweill/gotests/...
go get -u -v golang.org/x/tools/cmd/guru
go get -u -v github.com/josharian/impl
go get -u -v github.com/haya14busa/goplay/cmd/goplay
go get -u -v github.com/uudashr/gopkgs/cmd/gopkgs
go get -u -v github.com/davidrjenni/reftools/cmd/fillstruct
go get -u -v github.com/alecthomas/gometalinter
gometalinter --install

方案二

由于 golang.org/x 的内容与 github.com/golang/tools 下的内容相同,故我们可以采取“曲线救国”的方式,安装 Go Tools 。

1
2
3
4
5
6
7
8
# 创建 golang.org/x 文件夹
mkdir $GOPATH/src/golang.org/x/
# 下载源码
go get -d github.com/golang/tools
# 复制
cp $GOPATH/src/github.com/golang/tools $GOPATH/src/golang.org/x/ -rf
# 安装 Go Tools
go install golang.org/x/tools/go/buildutil

完成 Go Tools 安装后,即可在 VSCode 中愉快编写 Golang 程序,但可能偶尔出现自动提示失效的问题,此时重启 VSCode 即可(重启大法好!)。

为了确保究极的开发体验,我在这里强烈推荐 GoLand IDE !

Go Tour

执行以下命令,我们即可在本地运行 Go Tour 应用程序。

1
2
3
4
# 安装 Go Tour
go get -u golang.org/x/tour
# 本地运行 Go Tour
tour

执行命令后,会自动打开 http://127.0.0.1:3999 页面。

Hello World

项目地址:github.com/Jiahonzheng/hello

我们在任意位置新建 Go-Hello 文件夹,随后执行 go mod init github.com/Jiahonzheng/hello 命令。

1
2
3
4
5
6
7
8
# 新建文件夹
mkdir -p Go-Hello
# 初始化 git 仓库(可选),添加远程仓库链接
cd Go-Hello/
git remote add origin https://github.com/Jiahonzheng/hello.git
git init
# 初始化 Go Modules
go mod init github.com/Jiahonzheng/hello

随后,我们使用 VSCode 打开 Go-Hello 文件夹,我们发现文件夹下有一个 go.mod 文件。我们新建 main.go 文件,并输入以下代码。

1
2
3
4
5
6
7
package main

import "fmt"

func main() {
fmt.Println("Hello World")
}

保存文件后,在终端执行 go install github.com/Jiahonzheng/hello 即可编译构建 hello 程序,执行此程序,即可观察到 Hello World 的输出。我们使用 which 查看文件所在目录,发现此文件位于 $GOPATH/bin 目录。

编写 Package

我们在 Go-Hello 创建 stringutil 文件夹,并在该文件夹内创建 reverse.go 文件。

1
2
3
4
5
6
7
8
9
10
11
// 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 github.com/Jiahonzheng/hello/stringutil 即可编译上述 package

我们需要变更 main.go 的代码,在其引入 stringutil 包。

1
2
3
4
5
6
7
8
9
10
11
package main

import (
"fmt"

"github.com/Jiahonzheng/hello/stringutil"
)

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

执行 go install github.com/Jiahonzheng/hello 命令构建 hello 程序,随后执行 hello 程序,可得以下输出。

由上图所示,我们成功导入了 stringutil 包。

编写测试

package 编写测试文件,是一个很好的编程习惯。在 Golang 中,我们只需创建 xxx_test.go 即可测试 xxx.go 的正确性。我们在 stringutil 文件夹下新建 reverse_test.go 文件,其代码如下。

PS:此处我们只添加了 Test 类测试,而没有添加 Benchmark 类的测试。

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)
}
}
}

执行 go test github.com/Jiahonzheng/hello/stringutil 即可对 stringutil 包进行测试。

终端输出的 ok 字样,说明 stringutil 已通过全部的测试。

CATALOG
  1. 1. 实验环境
  2. 2. 安装过程
    1. 2.1. gvm
    2. 2.2. 科学上网
    3. 2.3. git
    4. 2.4. Visual Studio Code
    5. 2.5. Go Tools
      1. 2.5.1. 方案一
      2. 2.5.2. 方案二
  3. 3. Go Tour
  4. 4. Hello World
  5. 5. 编写 Package
  6. 6. 编写测试