go 语言开发环境的安装【完美解决无法登录 golang.org 问题】

安装 go 语言开发环境

Table of Contents

1. 系统硬件与操作系统

本次实验安装 go 语言所使用的环境如下:

  • 处理器架构:x86-64(Intel® Core™ i5-8250U)
  • 操作系统:Ubuntu 18.04.4 LTS

这里的 ubuntu 操作系统,是在双系统的环境下直接运行,没有采用虚拟机的方式运行。不过,使用虚拟机应该也差别不大。具体的系统需求可以在 go 中文官网的 安装指南 中查看:

操作系统架构
FreeBSD 7或更新amd64、386、arm
Linux 2.6.23或更新,带glibcamd64、386、arm
Mac OS X 10.6或更新amd64、386
Windows 2000或更新amd64、386

2. 安装 golang

go 的官方网站 提供了 go 的二进制发行文件进行安装,可以针对计算机的操作系统选择下载。但是,访问 go 的官方网站需要科学上网,通过 go 中文官网下载,也是重定位到 go 的官方网站。而系统包管理工具下载的 go 版本较低,对后续的安装有一定的影响。因此,可以选择在镜像网站下载相应的二进制安装包,使用中文官网的教程进行安装,文章的最后提供了镜像网站的链接。

下载对应的安装包后,按照官网的指示,提取到 /usr/local 目录。具体的 go 安装目录即为上述的解压目录 /usr/local/go。然后需要在 ~/.profile 中添加以下语句 export PATH="$PATH:/usr/local/go/bin,将 /usr/local/go/bin 添加到 PATH 环境变量。可以通过执行以下的 echo 指令完成添加操作,执行 source ~/.profile 可以将配置应用到当前环境。安装完成以后,可以通过 go version 指令查看已安装的 go 版本。具体执行的指令如下:

echo 'export PATH="$PATH:/usr/local/go/bin"' >> ~/.profile
source ~/.profile
go version

install-go

3. 配置环境变量

使用以下指令,可以在 ~/.profile 文件的结尾处增加 export GOPATH=$HOME/Projects/goworkexport PATH=$PATH:$GOPATH/bin 语句。这样每次启动操作系统时,会添加相应的系统变量,设置 go 的工作空间。这里的 go 工作空间设置为:~/Projects/gowork,如果要设置为其他路径,只需将 GOPATH 变量设置为对应的路径即可。

echo 'export GOPATH="$HOME/Projects/gowork"' >> ~/.profile
echo 'export PATH="$PATH:$GOPATH/bin"' >> ~/.profile
source ~/.profile

同样执行指令 source 指令可以立即执行上述配置,完成环境变量的添加,可以看到对应的变量已经成功设置。

env-var

4. 测试 golang 的安装

首先创建并跳转到对应的工作目录,并创建相应的 hello.go 文件:

mkdir $GOPATH/src/github.com/github-user/hello -p
cd $GOPATH/src/github.com/github-user/hello
code hello.go
go run hello.go

程序能够正常执行,说明 golang 已经成功安装。

hello-go

5. 安装 go 的相关工具

打开 vscode 编写 go 代码,会弹出提示提醒安装相关的 go 工具。没有安装这些插件前,vscode 对 go 语言的支持不够完美,如 gofmt 帮助进行代码格式化,gotests 支持进行单元测试、go-outline 支持显示概述等等。

go-outline-install

但是由于我们无法登录 go 的官方网站,需要我们下载对应的安装工具以及修改下载 go 插件的代理服务器。执行下列指令即可完成代理服务器的修改以及相关安装工具源代码的下载,并且复制到本地的相关文件夹进行安装。

go env -w GOPROXY=https://goproxy.cn,direct
go get -d github.com/golang/tools
mkdir $GOPATH/src/golang.org/x/ -p
cp $GOPATH/src/github.com/golang/tools $GOPATH/src/golang.org/x/ -rf
go install golang.org/x/tools/go/buildutil

install-util

此时,重启 vscode 再点击上图的 Install All 即可安装对应的插件。可以看到修改代理服务器后,所有的 go 插件都安装成功了。

install-util

go-outline 安装前后的效果对比图:

bef-go-outline
aft-go-outline

安装完上述的插件后,go 的工作空间的文件结构如下,与官方文档 Go 编程的工作空间基本一致:

./
|---bin/
|   |---dlv
|   |---...
|   `---impl
|---pkg/
|   |---linux_amd64/golang.org/x/tools/go/
|   |   `buildutil.a
|   |---mod/
|   |   |---9fans.net/
|   |   |---...
|   |   `---gopkg.in/
|   `---sumdb/sum.golang.org/
|       `latest
`---src/
    |---github.com/
    |   |---github-user/hello/
    |   |   `hello.go
    |   `---golang/tools/
    |       |---benchmark/
    |       |---...
    |       `---README.md
    `---golang.org/x/tools/
        |---benchmark/
        |---...
        `---README.md

完成上述步骤,此时可以对我们编写的代码进行安装并能够直接执行。

go install github.com/github-user/hello
hello

6. 安装与运行 go tour

github 上的 Go-zh/tour 仓库介绍了 go 语言的相关语法,帮助我们快速入门。使用 go get 指令可以得到 go tour 的离线教程,执行 tour 可以打开教程。执行的指令具体如下:

go get -u github.com/Go-zh/tour
tour

如果遇到了下面截图所示的错误,可以执行指令:

get-tour-error

go get github.com/golang/net/websocket
cp $GOPATH/src/github.com/golang/net $GOPATH/src/golang.org/x/ -rf
go build

修复错误后,再次执行安装 go tour 的指令,即可成功安装。最后执行 tour 指令的结果如下。

fix-get-tour-error

go-tour

7. 第一个包与测试

在运行Go程序时,包对象无需存在,go 语言可以编写包,用于模块化以及远程或本地的代码复用,复用包对象时使用的是静态链接。

7.1. 包对象的编写

  1. 首先要使用 mkdir 指令创建包目录,如:mkdir $GOPATH/src/github.com/github-user/stringutil

  2. 在该目录下,编写包的原文件。在该例子中,创建了 reverse.go 文件,内容如下:

    // Package 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)
    }
    
  3. 使用 go build 指令进行包的编译。如果当前的目录不在包目录需要加上包路径。值得注意的是,这里的包路径是指相对于 $GOPATH/src/ 的路径,如该例子中可以执行:go build github.com/user/stringutil

  4. 要产生静态库文件可以使用 go install 指令,具体的用法和 go build 相同。包的对象放到工作空间的 pkg 目录里的相应路径。在本例中,具体的包文件在 $GOPATH/pkg/linux_amd64/github.com/github-user

7.2. 调用包对象

要使用已经编写好的远程或本地的包对象,可以在源代码中使用 import 语句中,引入包对象。远程引入需要使用对应的 url。导入成功后使用 go install 指令,go 工具会安装它所依赖的包文件。在本例中,stringutil 包也会被自动安装在 pkg 目录里,并且将 hello 可执行文件生成在 bin 目录下。本例的具体代码与执行结果如下:

package main

import (
    "fmt"

    "github.com/github-user/stringutil"
)

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

go-result

7.3. 包的测试

go 支持轻量级的测试框架。在对应的包路径下,编写好对应的测试文件,执行指令 go test 即可完成相应的单元测试。测试框架会运行名字以 _test.go 结尾的文档中,每一个名为 TestXXX 且签名为 func (t *testing.T) 的函数。若函数调用了 t.Errort.Fail 等类似的函数,表示该测试失败。本例中编写的 $GOPATH/src/github.com/github-user/stringutil/reverse_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)
        }
    }
}

程序的测试结果如下:

在这里插入图片描述

7.4. 关于包名的讨论

Go源文件中的第一个语句必须是:package <pkg-name>,并且建议包的注释以 // Package <pkg-name> 的形式出现。若这个包生成可执行文件,则必须使用 package main。其他包名可以自行设定,通常以导入路径的最后一个元素作为包名。不同的包以导入路径进行区分,包名无需唯一。

8. 问题或要点小结

进行本次实验最主要遇到的问题是无法访问 golang.org 这一网站。这个问题影响到我们下载、安装 go 语言以及相关的插件。在不修改代理服务器时,只能安装部分插件且速度较慢。修改代理服务器后,则能像上面的教程中一样,快速地将所有的插件安装成功。

未修改代理服务器的安装结果

安装 go tour 时,有可能会遇到 unrecognized import path 错误。具体的错误原因是 tour 包需要使用到 websocket 包。由于本地上没有对应的包。go get 语句会到 https://golang.org/x/net/websocket 上自动地获取、构建并安装。但是由于我们无法上 golang.org 这一网站,所以获取包失败。我们只能通过 github 手动下载、构建该 websocket 包完成上述操作。

这是一个非常常见的问题,因为使用别人开发的包难免会遇到我们没有安装的包对象,尤其使用 go get 语句。此时应该仿照上面的方法:手动从 github 等其他镜像网站下载对应的包对象,完成依赖包对象的下载。

9. 相关博客链接

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值