注:
- 该文章原本服务于中山大学服务计算课第一次作业
谁适合看本文?
- 在上pml的服务计算课的同学
- 使用Ubuntu,正在安装golang的小白
- 使用Wsl,正在安装golang的小白
- 使用Windows,纠结于安装虚拟机或者双系统,且正在安装golang的小白
目录
1 系统环境
设备 | 操作系统 |
---|---|
Surface pro (2018) | ubuntu(WSL) |
要在windows机器上安装linux,传统的办法是双系统或者虚拟机,前者麻烦,后者性能孱弱。
于是我尝试了下win10的WSL(Windows Subsystem for Linux,即在Windows中内置一个羽量级的Linux子系统,使用时可在窗口中打开,通过命令行操作),搭配VSCode为之配套的Remote WSL功能。目前为止还比较顺利,既不麻烦也不孱弱。
WSL不提供图形界面,所有的操作都通过命令行执行。
在权限设置允许后,通过VSCode Remote WSL能管理子系统中的文件。
WSL下的Ubuntu与普通的Ubuntu并没有本质上的区别,因此本文也可供使用Ubuntu虚拟机或双系统的同学参考。
2 安装Golang
2.1 自动安装
ubuntu安装软件一般通过apt这一工具,这里可以用以下语句一键自动安装golang:
$ sudo apt install golang-go
但是!用这样的办法自动安装的golang并非最新版(15.1),而是13.8。
2.2 版本低会有什么问题?
作业文档中写到“版本低不会影响正常使用”,但实际上版本非最新会导致无法安装vscode的go tools。因此需要更新。
2.3 更新
大体参考该博客的方法(但部分地方有问题):
https://www.jianshu.com/p/85e...
卸载旧版本(可选)。
$ apt remove golang-go
下载。参考最新版本,在这里需要的是以下代码:
$ wget https://studygolang.com/dl/golang/go1.15.2.linux-amd64.tar.gz
解压。注意,解压到/usr/local可能会更好(/usr/local才是默认的安装地址):
$ tar -zxvf golang/go1.15.2.linux-amd64.tar.gz -C /usr/local
- 设置环境变量,并执行使之生效(非常讲究,单开一节,详见3 环境变量)
检查版本
$ go version
如以下显示就表示更新完成了。
go version go1.15.1 linux/amd64
否则多半是环境变量的问题.
3 环境变量
3.1 在哪里设置环境变量
首先需要理解ubuntu的环境变量,可参考文章:
https://my.oschina.net/liting...
添加环境变量的逻辑是很简单的,在环境变量文件中用export语句写入环境变量,再用source命令执行该文件即可。问题在于ubuntu中有多个环境变量文件,且每个文件的生效范围、生效时间各不相同,且互相影响。如果设置不好环境变量很容易出现以下问题:
- 每次重启终端后环境变量都会失效,需要重新执行source命令
- 修改环境变量时多个环境变量文件间产生冲突
这里给出我自己的经检验有效的环境变量设置方法:
只在/etc/profile文件中写入环境变量,方法是在文件后方空白处加入条目,例如(需要这三条,具体变量值仅供参考,如何确定请看3.2):
export GOPATH=/home/chen/gowork export GOROOT=/usr/local/go export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
在~/.bashrc文件后方增添一条
source /etc/priofile
在终端中输入source /etc/profile或重启终端后环境变量会开始生效。
3.2 根据你的情况修改环境变量
你需要根据你的情况决定你的go环境变量,首先需要理解go的环境变量。可参考文章:
https://juejin.im/post/684490...
或官方手册:
https://go-zh.org/doc/code.ht...
GOPATH: 你的工作目录,完全取决于你。如果你使用WSL或有使用远程桌面的需求,我建议你把工作空间放在非root权限的目录,并在设置好GOPATH后使用chmod命令改变工作目录的权限:
$sudo chmod 777 $GOPATH
- GOROOT: 一般不需要手动设置,但由于我们以解压覆盖的方式手动更新golang,GOROOT变量没有被自动更新,所以需要手动设置。GOROOT应为go的安装目录,如果你在上面的步骤中解压在了/usr/local/,则这里应该设为/usr/local/go
设置完毕并执行source命令后可通过以下命令检验环境变量是否修改成功:
# print GOPATH
$ echo $GOPATH
# print GOROOT
$ echo $GOROOT
# or print all go environment variables
$ go env
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
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提示安装的工具中,一些来自非官方的github仓库,此时这些工具你的本地还没有,请对应使用go get指令。
例:
提示 :
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!
执行后的工作空间:
$GOPATH
├─bin
| └─hello
|
├─ pkg
| └─linux_amd64
| └─github.com
| └─github-user
| └─stringutil.a
|
└─src
└─ github.com
└─github-user
├─hello
| └─hello.go
└─stringutil
└─reverse.go
注意,安装包时只有使用
$ go install github.com/github-user/hello
才会在pkg中生成包文件。
$ cd $GOPATH/src/github.com/github-user/hello $ go install
这种方式不会生成pkg文件。