# 前言
最近在学习 go 语言,当然编辑器用的还是最熟悉的 vs code 了。
虽然说 vs code 着实很占内存,但是没办法,谁让他配置起来方便快捷,并且对于前端程序员来说,着实是一大开发利器。
之前也用过 sublime, notepad++ 等轻量级编辑器,但是自从用过了 vs code 以后,就再也用不回去了。着实有种“曾经沧海难为水,除却巫山不是云”的感觉。
写前端代码写习惯了,装个插件也是方便的狠,直接搜一下,然后点击安装,装好以后重启一下编辑器就能愉快的使用了。
但是这套经验对于我这个 go 的新手来说,却不是那么的适用了。
打开插件扩展,搜与 go 有关的插件,排在第一个的就是微软官方出品的 go 插件。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20181201123129132.png)
当时一想,我就乐了,既然编辑器用的都是人家开源的产品,那么人家定制的 go 插件也没有理由不用了吧。
这一用不要紧,却让我后面折腾了好久,才搞明白,原来人家这插件是给你装上了个全家桶啊。
# 不断地报错
我天真的以为,装了这个插件以后,直接就能用了,哪曾想到,我 `shift + alt + F` 格式化代码的时候,就会蹦出下面类似的提醒:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20181201123159643.png)
于是我就只能点个 Install All 了,却没想到每次 go 这个插件总是不断地提示安装失败了,大概就是输出下面这样的提示信息:
```javascript
Installing github.com/derekparker/delve/cmd/dlv FAILED
Installing github.com/stamblerre/gocode FAILED
Installing github.com/ianthehat/godef FAILED
Installing github.com/sqs/goreturns FAILED
```
当然我这里就只是截取了小部分,因为我已经装好了,也懒得卸载了再演示了。
# 盲目的搜寻
开始我很盲目,没有冷静下来分析一下为什么会出现这个原因。现在想来,当时确实很 naive,完全丧失掉了一枚程序员应当具有的沉着冷静的风范。
我开始用搜索引擎寻找答案,发现找到的都是一些同类型的文章,而且大家的答案居然出奇的一致,就类似下面这样:
1. 之所以会出现这个原因,是因为 google 的相关网站被和谐掉了,因为下载不了相关工具
2. 跟我一起来吧,让我手摸手教你该怎么完美解决这个问题。咳咳,这里请自行脑部一下老司机的音容。
3. 克隆 tools 这个 github 项目
4. 在个人的文件夹内的 go 路径中创建一份诸如 `C:\Users\root\go\src\golang.org\x\tools` 这种路径的文件目录(*博主按:这个步骤没错,但是不知道是出于疏忽还是疏忽,居然没有一篇文章告诉你为什么要这么做*)
5. 把克隆下来的 tools 文件夹覆盖路径中的同名文件夹
6. cd 到 `C:\Users\root\go\bin` 目录,开始执行一大串命令行命令
大多数文章,差不多到这里就戛然而止了。
我照着文章反复的执行了好多次,每一次都前功尽弃了。因为每每总是 fail 掉了,还是有一堆插件没装上。
就在我开始气妥的时候,胜利的曙光终于来临了,命运女神开始眷顾我了。
我鬼使神差的看了一眼 `C:\Users\root\go\bin` 目录中的文件:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20181201123229880.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xvdmVmZW5ncnVvcWluZw==,size_16,color_FFFFFF,t_70)
这一看,简直让我大跌眼镜,我终于明白了这个 vs code 中 go 这个插件到底干了啥,也明白了怎么才能正确的装上 go 插件调用的程序了。
# 阐述原理
原来 vs code 中的 go 插件,就是在 go 的环境变量中调用一些程序,来对 go 的源码执行一些检查、测试、格式化、重命名、代码检查等操作。
## go 的 env
通过 `go env` 查看 go 的系统配置参数:
```bash
C:\Users\root>go env
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\root\AppData\Local\go-build
set GOEXE=.exe
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOOS=windows
set GOPATH=C:\Users\root\go
set GOPROXY=
set GORACE=
set GOROOT=D:\Software\go
set GOTMPDIR=
set GOTOOLDIR=D:\Software\go\pkg\tool\windows_amd64
set GCCGO=gccgo
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set GOMOD=
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0 -fdebug-prefix-map=C:\Users\root\AppData\Local\Temp\go-build998644522=/tmp/go-build -gno-record-gcc-switches
```
我们定位到 `set GOPATH=C:\Users\root\go` 这一行,不难发现,我们的 go 程序的系统路径在什么地方。
通俗点来讲,我们在 go 程序中经常会使用一些第三方的包,例如:
```go
import (
"golang.org/x/tour/tree"
"fmt"
)
```
我们编译我们的 go 程序的时候,就是从这个 gopath 下面的 src 文件夹中寻找我们的第三方包的。
换句话就是说,我们可以编写一些自己的 go 扩展包,放在这里文件夹里,然后就可以直接全局引用了。
## go 插件的使用揭秘
虽然我没有看过 vs code 的 go 插件的源码,但是现在我刚大胆的说,我已经了解 go 插件的使用哲学了。
它其实并没有写具体的工具(这是我的猜想),对 go 的源码进行解析,而是调用 go 的一些优秀插件,对 go 源码执行一些操作。
也就是说,除了 go 官方自带的那些 格式化 等等插件以外,它会在 gopath 的 bin 目录下寻找对应的工具,对 go 源码执行操作。
如果这个工具没找到,每次就会不厌其烦的提醒你,你没有安装对应的工具,然后弹出提示框,问你要不要安装。
安装的时候,也是从对应的 go 工具的 github 网站或 golang 官网下载。下下来以后放在 src 文件夹内,然后通过 `go install 包名` 安装到 bin 目录下,供下次调用的时候使用。
因此,对于下载不下来的插件,我们可以手动的在 github 或 golang 网站找到对应的工具包,放在对应的目录中,然后对工具包进行编译,将编译后的二进制文件放在 bin 目录下即可。
# 安装范例
下面我就以安装 goturns 这个插件为例,介绍一下怎么手动安装这些老是安装不成功的插件。
## 克隆对应的项目到本地
从 `Installing github.com/sqs/goreturns FAILED` 这条提示信息我们可以看出来,这个插件所在的网址是多少。
我们打开我们的浏览器,在地址栏输入 `github.com/sqs/goreturns` ,然后回车,就进入了插件的 github 页面:
![在这里插入图片描述](https://img-blog.csdnimg.cn/2018120112330484.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xvdmVmZW5ncnVvcWluZw==,size_16,color_FFFFFF,t_70)
看到这里,我想聪明的你不难明白,原来我们装的插件就是 github 上开源的 go 插件,而 `sqs` 是用户,`goreturns` 是项目名称。
我们为了尊重插件的开发者,直接就按照 github 的页面编排的目录,直接把我们的项目克隆到 `$GOPATH\src\github.com\sqs\goreturns` 文件夹之中。
所以我们就在 `$GOPATH\src\github.com\` 目录下,新建一个文件夹为 `sqs` 我想用过类 Unix 系统的用户都应该明白了,我们相当于建了一个 sqs 用户的个人文件夹,里面可以放他个人的项目,而这个用户本来是 github.com 的用户。
打开我们的控制台,在 `$GOPATH\src\github.com\sqs\` 路径下,执行 `git clone git@github.com:sqs/goreturns.git` 命令,将项目克隆到我们本地。
以下是在我电脑上执行的过程,可以看出来下载网速较慢,因此花了很长时间:
```bash
C:\Users\root\go\src\github.com\sqs>git clone git@github.com:sqs/goreturns.git
Cloning into 'goreturns'...
remote: Enumerating objects: 8, done.
remote: Counting objects: 100% (8/8), done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 152 (delta 3), reused 6 (delta 3), pack-reused 144
Receiving objects: 100% (152/152), 6.85 MiB | 5.00 KiB/s, done.
Resolving deltas: 100% (79/79), done.
```
这里不得不吐槽一下的是,不同电信运营商,对国外网站的支持程度也迥然不同。
我在公司克隆 github 项目,非常的快,但是在家里就慢的出奇。我在公司根本打不开 [coursera](https://coursera.org), 但是在家里却有不错的速度。
## 编译成二进制文件
完全的将项目克隆下来了以后,接下来要做的就是将项目编译成对应的二进制文件。
其他插件安装的原理也是一样的,安装的过程也是大同小异,学会了下面这个范例,就能举一反三了。
### 编译好后移到 \$GOPATH\bin 目录下
了解 go 的你,应该明白 go 源文件是怎么编译的吧。
我们仅仅只需要,在对应的项目路径下,执行 `go install` 命令,就能自动找对应的同名入口文件开始编译。
看看我们的 goreturns 项目:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20181201123321628.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xvdmVmZW5ncnVvcWluZw==,size_16,color_FFFFFF,t_70)
不看不觉得,一看我就觉得要吐血了,这位 sqs 用户,对我们中国的开发者“太不友好了”,整个项目其实很小,源代码就几十 kb,但是 sqs 居然朝里面塞了一个接近 6.5Mb 的 screencast.gif 文件。
然而,打开一看,也就是一个十秒左右的演示代码使用的录屏。这老哥(或老姐)不知道用的什么录制 gif 的软件,录屏的效率惊掉人的下巴了。
这也间接的“坑了”我们国内的开发者了,以我们克隆 github 项目的平均网速来看,本来十秒钟能克隆下来的项目,这下好了,十分钟也克隆不下来了。
执行了 go bulid 以后,我们的文件夹下就多了一个二进制文件 goreturns.exe 了
![在这里插入图片描述](https://img-blog.csdnimg.cn/2018120112334486.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xvdmVmZW5ncnVvcWluZw==,size_16,color_FFFFFF,t_70)
接下来要做的就是,将二进制文件**复制**或**剪切**到我们的 `$GOPATH\bin` 目录下就大功告成了。
### 直接在 \$GOPATH\bin 目录下编译
在 `$GOPATH\bin` 目录下,直接执行命令 `go install github.com/sqs/goreturns` 命令,go 编译程序就会自动的到 `$GOPATH\src` 目录下,找到对应的 goreturns 包,对其进行编译,编译后得到的二进制文件就在当前所在的 bin 目录下了。
# 后记
本来是一件很简单很容易理解的事情,但是就是很难找到合适的直指核心本质的教程。
不得不感叹,互联网虽然资料很多,信息繁杂,但是真正想找到对你有用的资料,却如同大海捞针。
不要浮躁,多想多实践,共勉吧!
有疑问加站长微信联系(非本文作者))