vscode 配置 Go 开发环境

本文介绍怎么在 Visual Studio Code 搭建 Go 开发环境。

安装 Go 插件

失败的原因

当我们在 vscode 安装完 Go 插件后,会提示需要安装一些命令行工具,
但在安装过程中,只有几个会成功,其他大部分都是会失败的。

原因是 Go 插件需要的命令行工具依赖 golang.org\x\tools 这个库,
而这个库是存放在 https://go.googlesource.com/tools 上的,

因为是 google 的东西,所以…万恶的防火墙。

知道原因后,有两种解决方法,请按自己的情况选择。

如果你折腾很久依然就没有成功,那么 goland 只要下载,安装则方便多了。

有梯子的解决方案

学习 Go 语言,那么看一些开源项目是很好的学习方式,
可以到 https://github.com 搜索:

有梯子解决方案的好处是,以后更新插件或命令行工具比较方便。

我们依然使用 Git 来克隆仓库。

打开一个 cmd 窗口,cd 到你想要存放仓库的位置,运行命令:

1
2
set HTTP_PROXY=127.0.0.1:1080
set HTTPS_PROXY=127.0.0.1:1080

目的是设置临时的环境变量,将 HTTP/HTTPS 请求指向梯子 Ss 的端口。

继续执行命令:

1
2
3
4
git config --global http.proxy http://127.0.0.1:1080
git config --global https.proxy http://127.0.0.1:1080

git config --global http.postBuffer 524288000

前两行的目的是让 Git 使用 HTTP/HTTPS 请求 push/pull 的时候走梯子 Ss 的端口,
而第三行的目的是 pull 仓库的时候,会出现缓存不足而失败,所以我们需要加大缓存,
524288000 B = 512 M

运行命令后可以使用一下命令查看设置情况:

1
git config --global  --list

得:

1
2
3
4
5
user.name=你的用户名
user.email=你的邮箱
http.proxy=http://127.0.0.1:1080
http.postbuffer=524288000
https.proxy=http://127.0.0.1:1080

补充一下,这三行的 Git 都是全局设置,关闭cmd窗口依然有效,
等安装好插件依赖的命令行工具后,可以用以下命令还原:

1
2
3
git config --global --unset http.proxy
git config --global --unset https.proxy
git config --global --unset http.postBuffer

然后我们就可以克隆仓库了:

1
git clone https://go.googlesource.com/tools

1
git clone https://go.googlesource.com/lint

拉取完毕后,请将 toolslint 文件夹剪切到 %GOPATH%\src\golang.org\x 下。

如果你之前使用 Go 插件安装过命令行工具,
那么最好把 %GOPATH% 下的 github.com 文件夹删了。

vscode 中按快捷键 ctrl + shift p
选择 Go:Install/Update Tools
然后勾选上所有,确定~

去喝杯茶稍等后…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Installing github.com/mdempsky/gocode SUCCEEDED
Installing github.com/uudashr/gopkgs/cmd/gopkgs SUCCEEDED
Installing github.com/ramya-rao-a/go-outline SUCCEEDED
Installing github.com/acroca/go-symbols SUCCEEDED
Installing golang.org/x/tools/cmd/guru SUCCEEDED
Installing golang.org/x/tools/cmd/gorename SUCCEEDED
Installing github.com/go-delve/delve/cmd/dlv SUCCEEDED
Installing github.com/stamblerre/gocode SUCCEEDED
Installing github.com/rogpeppe/godef SUCCEEDED
Installing github.com/sqs/goreturns SUCCEEDED
Installing golang.org/x/lint/golint SUCCEEDED
Installing github.com/cweill/gotests/... SUCCEEDED
Installing github.com/fatih/gomodifytags SUCCEEDED
Installing github.com/josharian/impl SUCCEEDED
Installing github.com/davidrjenni/reftools/cmd/fillstruct SUCCEEDED
Installing github.com/haya14busa/goplay/cmd/goplay SUCCEEDED

All tools successfully installed. You're ready to Go :).

以上是 Go 版本:go version go1.11.4 windows/amd64 需要安装的命令行工具

Installing github.com/mdempsky/gocode SUCCEEDED
Installing github.com/uudashr/gopkgs/cmd/gopkgs SUCCEEDED
Installing github.com/ramya-rao-a/go-outline SUCCEEDED
Installing github.com/acroca/go-symbols SUCCEEDED
Installing golang.org/x/tools/cmd/guru SUCCEEDED
Installing golang.org/x/tools/cmd/gorename SUCCEEDED
Installing github.com/go-delve/delve/cmd/dlv SUCCEEDED
Installing github.com/stamblerre/gocode SUCCEEDED
Installing github.com/rogpeppe/godef SUCCEEDED
Installing github.com/sqs/goreturns SUCCEEDED
Installing golang.org/x/lint/golint SUCCEEDED
Installing github.com/cweill/gotests/… SUCCEEDED
Installing github.com/fatih/gomodifytags SUCCEEDED
Installing github.com/josharian/impl SUCCEEDED
Installing github.com/davidrjenni/reftools/cmd/fillstruct SUCCEEDED
Installing github.com/haya14busa/goplay/cmd/goplay SUCCEEDED

All tools successfully installed. You’re ready to Go :).

没有梯子的解决方案

目的还是获取 golang.org\x\toolsgolang.org\x\lint 两个库,
但没有梯子不能从 https://go.googlesource.com 上获取,
好在有人已经将其同步到 https://github.com/golang/toolshttps://github.com/golang/lint 上,
我们将其下载下来,
解压后将其内容剪切到 %GOPATH%\src\golang.org\x\tools%GOPATH%\src\golang.org\x\lint
然后用命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
go get github.com/mdempsky/gocode
go get github.com/uudashr/gopkgs/cmd/gopkgs
go get github.com/ramya-rao-a/go-outline
go get github.com/acroca/go-symbols
go get golang.org/x/tools/cmd/guru
go get golang.org/x/tools/cmd/gorename
go get github.com/go-delve/delve/cmd/dlv
go get github.com/stamblerre/gocode
go get github.com/rogpeppe/godef
go get github.com/sqs/goreturns
go get golang.org/x/lint/golint
go get github.com/cweill/gotests/...
go get github.com/fatih/gomodifytags
go get github.com/josharian/impl
go get github.com/davidrjenni/reftools/cmd/fillstruct
go get github.com/haya14busa/goplay/cmd/goplay

需要注意的是,从 Go 1.12 开始,
很多作者会开始根据新 Go module 机制更新版本,或干脆另起一个新的仓库。
github.com/mdempsky/gocodegithub.com/stamblerre/gocode

Go 插件特性介绍

智能提示

  • 当您键入代码时会自动完成 (使用 gocode)
  • 提示函数(方法)签名 (使用 gogetdoc 或者 godef+go doc)
  • 鼠标停留在代码上时,会提示相关信息 (使用 gogetdoc 或者 godef+go doc)

代码导航

  • 跳转到或查看定义 (使用 gogetdoc 或者 godef+go doc)
    • 转到定义 F12
    • 查看定义 Alt+F12
  • 找出相关的引用和接口的实现 (使用 guru)
    • Find All Reference Shift+Alt+F12
    • 查看引用 Shift+F12
  • 查看文件大纲 或 转到文件中符号 (使用 go-outline)
    • 按快捷键 Ctrl+Shift+O 后可以查看文件大纲,然后转到定义处
  • 转到工作区中的符号(定义) (使用 go-symbols)
    • 按快捷键 Ctrl+T 可以搜索是在哪个文件中声明定义的
  • 在 Go 程序和相应的测试文件之间切换

代码编辑

  • 快速编辑代码段
  • 保存文件时自动格式化代码 (使用 goreturnsgoimportsgofmt)
    • 在 settings.json 配置文件中可以 “go.formatOnSave”: true,
    • 在 settings.json 配置文件中可以 “go.formatTool”: “goreturns”,
  • 重命名 (使用 gorename, 注意:如果想撤消重命名,你需要 diff)
  • 添加 Imports 到当前文件 (使用 gopkgs)
    • 右击 → Go:Add Import 然后选择
  • 给 struct 的字段添加/移除 标签 (使用 gomodifytags)
    • 选择字段 → 右击 → Go:Add Tag To Struct Fields
  • 为接口生成方法存根 (使用 impl)
  • Fill struct literals with default values (使用 fillstruct)

代码诊断

  • Build-on-save 编译代码并显示构建错误 (使用 go buildgo test)
  • Vet-on-save 运行 go vet 并将错误显示为警告
  • Lint-on-save 将 linting 错误显示为警告 (使用 golint, gometalinter, staticcheck, golangci-lintrevive)
  • 键入时语义/语法错误报告 (使用 gotype-live)

单元测试

  • Run Tests under the cursor, in current file, in current package, in the whole workspace using either commands or codelens
  • Run Benchmarks under the cursor using either commands or codelens
  • 根据需要或在包中运行测试后显示代码覆盖率
  • 生成单元测试骨架 (使用 gotests)

调试

  • 调试你的代码,二进制文件 或 测试 (使用 delve)

其它

  • 安装/更新所有相关的 Go 工具
  • 上传到 Go Playground (使用 goplay)
觉得文章对您有帮助,请我喝瓶肥宅快乐水可好 (๑•̀ㅂ•́)و✧
  • 本文作者: 阿彬~
  • 本文链接: https://iweixubin.github.io/posts/vscode/go-ide/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 免责声明:本媒体部分图片,版权归原作者所有。因条件限制,无法找到来源和作者未进行标注。
         如果侵犯到您的权益,请与我联系删除