注:

  • 该文章原本服务于中山大学服务计算课第一次作业
  • 谁适合看本文?

    1. 在上pml的服务计算课的同学
    2. 使用Ubuntu,正在安装golang的小白
    3. 使用Wsl,正在安装golang的小白
    4. 使用Windows,纠结于安装虚拟机或者双系统,且正在安装golang的小白

目录

1 系统环境

设备操作系统
Surface pro (2018)ubuntu(WSL)

要在windows机器上安装linux,传统的办法是双系统或者虚拟机,前者麻烦,后者性能孱弱。
于是我尝试了下win10的WSL(Windows Subsystem for Linux,即在Windows中内置一个羽量级的Linux子系统,使用时可在窗口中打开,通过命令行操作),搭配VSCode为之配套的Remote WSL功能。目前为止还比较顺利,既不麻烦也不孱弱。

WSL不提供图形界面,所有的操作都通过命令行执行。
image.png

在权限设置允许后,通过VSCode Remote WSL能管理子系统中的文件。
image

WSL下的Ubuntu与普通的Ubuntu并没有本质上的区别,因此本文也可供使用Ubuntu虚拟机或双系统的同学参考

2 安装Golang

主要参考以下教程:

注意

1.安装包下载地址在以下地址获取最新

2.为了方便安装tool,环境变量里多加这个:

3 环境变量

3.1 在哪里设置环境变量

首先需要理解ubuntu的环境变量,可参考文章:

添加环境变量的逻辑是很简单的,在环境变量文件中用export语句写入环境变量,再用source命令执行该文件即可。问题在于ubuntu中有多个环境变量文件,且每个文件的生效范围、生效时间各不相同,且互相影响。如果设置不好环境变量很容易出现以下问题:

  • 每次重启终端后环境变量都会失效,需要重新执行source命令
  • 修改环境变量时多个环境变量文件间产生冲突

如果你使用bash,可直接在~/.bashrc文件后方增添一条

export GOPATH=/home/chen/gowork
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

在终端中输入source ~/.bashrc或重启终端后环境变量会开始生效。

(如果使用zsh,则是~/.zsh)

3.2 根据你的情况修改环境变量

你需要根据你的情况决定你的go环境变量,首先需要理解go的环境变量。可参考文章:
https://juejin.im/post/684490...
或官方手册:
https://go-zh.org/doc/code.ht...

$sudo chmod -R 777 $GOPATH

设置完毕并执行source命令后可通过以下命令检验环境变量是否修改成功:

# print GOPATH
$ echo $GOPATH

# print GOROOT
$ echo $GOROOT
  
# or print all go environment variables
$ go env

image.png
image.png

4 hello.go

试着运行hello.go检验安装是否成功。

建立源代码目录并建立代码文件:

# 创建文件夹
$ mkdir $GOPATH/src/github.com/github-user/hello -p

# 进入文件夹
$ cd $GOPATH/src/github.com/github-user/hello

# 创建文件hello.go
$ touch hello.go

hello.go:

package main

import "fmt"

func main() {
 fmt.Printf("hello, worldn")
}

run(在hello目录):

$ go run hello.go

输出:

hello,world

image.png

5 安装go tools

当你每次打开vscode后第一次修改一个.go文件后,vscode会提醒你安装tools。其方法是通过go get指令从网络中获得各项工具的文件到本地 GOPATH/src/并安装到GOPATH/bin。

而go get会自动从golang(golang.org)官网中拉取内容并安装。由于众所周知的原因,golang.org在大陆无法访问,因此无法自动安装tools。好在这些内容在github上都有,我们可通过仍在墙内的github来拉取这些文件,然后手动安装。

5.1 从官方github仓库中拉取来自官方的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

执行上述三条命令后会把golang官方的tools全部拉取到本地,且以合适的文件组织方式组织。(从golang.org拉取会优先在本地$GOPATH/src/golang.org/中搜索,如果找到就不必再上https://golang.org拉取)

此时你的工作空间目录结构应该如此:

$GOPATH
   └─src
      ├─ github.com
      |      └─ golang
      |           └─ tools
      └─ golang.org
             └─ x

里面已经有了官方的一些golang工具。至此完成了准备工作。

5.2 按失败提示拉取工具

现在可以开始手动拉取了,请按vscode提示的failed信息逐个拉取(会有一点点麻烦)。

5.3 Magic!

! 提供另一个超简单的方法:https://goproxy.cn/

:

提示 :

installing github.com/sqs/goreturns FAILED 

对应应该在终端中执行:

go get github.com/sqs/goreturns

由于一些工具间具有依赖关系,如果你在按顺序拉取时遇到超时,可以先拉取后面的工具,之后再拉取前面被跳过的工具。

6 通过go tour初步学习golang

这是Go语言的官方中文教程,可安装到本地离线运行,也可在网页上学习。

7 第一个包测试

工作空间中有关目录结构如下:

$GOPATH
  └─src
     └─ github.com
            └─github-user
                 ├─hello
                 |  └─hello.go 
                 └─stringutil
                     └─reverse.go 

其中:

hello.go:

package main
import (
 "fmt"
 "github.com/github-user/stringutil"
)

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

reverse.go:

package main

import (
 "fmt"
 "github.com/user/stringutil"
)

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

测试执行:

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

结果:

Hello, Go!

image.png

执行后的工作空间:

$GOPATH
   ├─bin
   |  └─hello 
   |
   ├─ pkg
   |   └─linux_amd64
   |       └─github.com
   |            └─github-user
   |                 └─stringutil.a 
   |
   └─src
      └─ github.com
            └─github-user
                 ├─hello
                 |  └─hello.go 
                 └─stringutil
                     └─reverse.go 

image.png
image.png
image.png

$ go install github.com/github-user/hello
$ cd $GOPATH/src/github.com/github-user/hello
$ go install