本文介绍怎么在 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 | set HTTP_PROXY=127.0.0.1:1080 |
目的是设置临时的环境变量,将 HTTP/HTTPS 请求指向梯子 Ss 的端口。
继续执行命令:1
2
3
4git 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
5user.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
3git 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 |
拉取完毕后,请将 tools
和 lint
文件夹剪切到 %GOPATH%\src\golang.org\x
下。
如果你之前使用 Go 插件安装过命令行工具,
那么最好把 %GOPATH%
下的 github.com
文件夹删了。
vscode 中按快捷键 ctrl + shift p
选择 Go:Install/Update Tools
然后勾选上所有,确定~
去喝杯茶稍等后…
1 | Installing github.com/mdempsky/gocode SUCCEEDED |
以上是 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\tools
和 golang.org\x\lint
两个库,
但没有梯子不能从 https://go.googlesource.com
上获取,
好在有人已经将其同步到 https://github.com/golang/tools
和 https://github.com/golang/lint
上,
我们将其下载下来,
解压后将其内容剪切到 %GOPATH%\src\golang.org\x\tools
和 %GOPATH%\src\golang.org\x\lint
下
然后用命令:
1 | go get github.com/mdempsky/gocode |
需要注意的是,从 Go 1.12 开始,
很多作者会开始根据新 Go module 机制更新版本,或干脆另起一个新的仓库。
如 github.com/mdempsky/gocode
和 github.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 程序和相应的测试文件之间切换
代码编辑
- 快速编辑代码段
- 保存文件时自动格式化代码 (使用
goreturns
或goimports
或gofmt
)- 在 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 build
和go test
) - Vet-on-save 运行
go vet
并将错误显示为警告 - Lint-on-save 将 linting 错误显示为警告 (使用
golint
,gometalinter
,staticcheck
,golangci-lint
或revive
) - 键入时语义/语法错误报告 (使用
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
)