可以在VSCode的扩展程序中查看设置的默认值和描述。 Ctrl+Shift+x来打开扩展程序窗口 找到Go扩展程序,单击来打开扩展程序的编辑器 单击Contributes标签页 滚动查看 如果需要修改其中的任何一个: 在用户首选项(cmd+,或者ctrl+,) 在工作空间设置(.vscode/settings.json) 中进行修改。 如果不进行修改,不需要拷贝这些参数。 向下滚动可以看到保护详细描述信息的所有命令的列表。
可以在扩展程序开发期间设置用于调试扩展程序的开发环境。 编译和调试扩展成程序 安装node 克隆代码仓库 执行npm install,并打开Code的开发实例 git clone https://github.com/Microsoft/vscode-go cd vscode-go npm install code . 检查一下window.openFileFoldersInNewWindow参数是否设置为no。 然后点击调试按钮(Ctrl+Shift+D)然后选择Lunch Extension然后执行(F5)。 在原来的VS Code窗口中可以添加在第二个代码窗中使用的任何扩展程序的功能时被命中的断点。 如果是在扩展名为.ts的文件中进行编辑,只需要重新加载(cmd-r) 代码的[Extension Development Host]实例,以加载新的扩展程序代码。处于调试中的实例将会自动的重新附加。 如果要调试调试器,请查看调试器的描述文档。 运行测试 要运行本地测试,只需要打开(Ctrl+Shift+D)调试器界面,然后选择Lanuch Tests,然后执行(F5)。 在侧栏加载扩展程序 在修改程序后,通常想要进行端到端的测试而不是在调试模式下运行它。为此可以在侧栏加载扩展程序,这可以通过准备扩展程序并直接加载来完成。 执行npm install -g vscode命令来检查是否在全局范围内安装了vsce 执行git clone https://github.com/Microsoft/vscode-go来克隆整个仓库 进入vs-code目录 执行npm install来安装依赖 执行vsce package命令来编译整个包,这将会生成扩展名为vsix的文件 执行Extensions: Install from VSIX...命令,并选择上一步生产的那个文件 使用扩展程序的测试版 如果想要帮助测试下一个新版本,或者使用尚未发布的新功能,请查阅使用Go扩展程序测试版文档。
安装delve 有两种方法可以安装delve: 执行指令Go: Install/Update Tools,然后选择dlv,点击ok来安装或者更新delve 参照安装指南手动安装 在settings中进行设置 调试器使用以下的设置项,你可能不需要添加/更改它们中的任何一个,以便在简单的情况下进行调试,但有时会给它们读取一些配置: go.gopath,查看扩展程序中设置GOPATH] go.inferGopath,查看扩展程序中设置GOPATH go.delveConfig: apiVersion:控制将要在无头服务中被使用的delve apis的版本,默认值为2。 dlvLoadConfig:当apiVersion为1时不适用。这个配置会传递给delve。控制delve的各种功能,这些功能会影响调试窗格中显示的变量。 maxStringLen:从字符串中读取的最大字节数 maxArrayValues:从数组,切片或map中读取的最大元素数 maxStructFields:从结构体中读取的最大字段数,-1表示将读取所有字段 maxVariableRecurse:评估嵌套类型时递归的程度 followPointers:请求指针自动解除引用 一些常见的情况,可能想要调整传递给delve的配置: 在调试模式中查看变量时,更改字符串和数组长度的默认上限64。 在调试模式中检查和评估嵌套的变量。 在launch.json中设置配置项 安装delve后,运行命令Debug:Open launch.json。如果还没有launch.json文件,则会创建一个具有以下默认配置的文件,该配置可用于调试当前包。 { "version": "0.2.0", "configurations": [ { "name": "Launch", "type": "go", "request": "launch", "mode": "auto", "program": "${fileDirname}", "env": {}, "args": [] } ] } 以下是可以在调试配置中调整的一些常见属性的更多信息: 属性 描述 name Debug视图下拉列表中显示的配置的名称 type 始终设置为“go”,VS Code使用它来确定应该使用哪个扩展程序来调试代码 request launch或者attach,使用attach当需要附加到一个已经在运行中的程序 mode 对于上个属性中的launch ,可选择auto,debug,remote,test,exec;对于上个属性中的attach,可选择local,remote program 在debug和test模式下,指定要调试的包或文件的绝对路径,或者在exec模式下调试的预构建二进制文件的绝对路径;不适用于attach env 调试时要使用的环境变量,如{ "ENVNAME": "ENVVALUE" } envFile 包含环境变量定义的文件的绝对路径,env属性中传递的环境变量会覆盖此文件中的变量 args 将传递给正在调试的程序的命令行参数数组 showLogs 布尔值,指示是否应在调试控制台中打印来自delve的日志 logOutput 以逗号分隔的delve组件列表(debugger,gdbwire,lldbout,debuglineerr,rpc),当设置为true时应生成调试输出 buildFlags 要传递给Go编译器的构建(build)标志 remotePath 远程调试时远程计算机上正在调试的文件的绝对路径,即mode设置为remote。有关详细信息,请参阅“远程调试”一节 processeid 仅在使用localmode的attachrequest时适用,这是运行需要调试的可执行文件的进程的id 在调试设置中使用VSCode变量 调试配置中采用文件夹/文件路径的任何属性都可以使用以下VSCode变量: ${workspaceFolder}:调试在VSCode中打开的工作空间的根目录下的程序包 ${file}:调试当前文件 ${fileDirname}:调试当前文件所属的包 使用构建标签 如果构建时需要构建标记(例如go build -tags=whatever_tag),那么添加参数buildFlags,内容为“-tags=whatever_tag”。 支持多个标记,将它们用双引号括起来,如下所示:“-tags='first_tag second_tag third_tag'”。 调试配置的代码段 编辑launch.json文件时,可以使用代码段进行调试配置。输入“Go”,将获得用于调试当前文件/包,测试功能等的片段。 用于调试当前文件的示例配置 { "name": "Launch file", "type": "go", "request": "launch", "mode": "auto", "program": "${file}" } 用于调试单个测试的示例配置 { "name": "Launch test function", "type": "go", "request": "launch", "mode": "test", "program": "${workspaceFolder}", "args": [ "-test.run", "MyTestFunction" ] } 用于调试包中所有测试的示例配置 { "name": "Launch test package", "type": "go", "request": "launch", "mode": "test", "program": "${workspaceFolder}" } 用于调试预构建二进制文件的示例配置 { "name": "Launch executable", "type": "go", "request": "launch", "mode": "exec", "program": "absolute-path-to-the-executable" } 使用processId附加到已在运行的本地进程的示例配置 { "name": "Attach to local process", "type": "go", "request": "attach", "mode": "local", "processId": 0 } 远程调试 要使用VSCode进行远程调试,必须首先在目标计算机上运行无头的Delve服务器。例如: dlv debug --headless --listen=:2345 --log --api-version=2 要传递给正在调试的程序的任何参数都必须传递给在目标计算机上运行的Delve服务器。例如: dlv debug --headless --listen=:2345 --log -- -myArg=123 然后,在VS Code launch.json中创建远程调试配置。 { "name": "Launch remote", "type": "go", "request": "launch", "mode": "remote", "remotePath": "absolute-path-to-the-file-being-debugged-on-the-remote-machine", "port": 2345, "host": "127.0.0.1", "program": "absolute-path-to-the-file-on-the-local-machine", "env": {} } 上面的示例在同一台机器上本地运行无头dlv服务器和VScode调试器。根据在远程计算机上的设置更新端口和主机。 remotePath应指向远程计算机中正在调试的文件(在源代码中)的绝对路径 program应指向本地计算机上与remotePath中对应的文件的绝对路径 当选择此新的Launch remote目标启动调试器时,VS Code会将调试命令发送到之前启动的dlv服务器,而不是针对应用启动它自己的dlv实例。 请参阅这篇文章中调试在docker主机中运行的进程的示例。 故障排除 如果在调试Go代码时遇到问题,请首先尝试更新的delve版本,以确保使用的是最新版本,并且已使用当前的Go版本进行编译。要执行此操作,请运行命令Go:Install/Update Tools,选择dlv,然后点击ok。 启动调试日志 将调试配置中的showLog属性设置为true。将从delve中看到调试控制台中的日志。 在调试配置中设置trace属性以进行记录。将从Go扩展程序的调试适配器中看到调试控制台中的日志。这些日志将保存到一个文件,该文件的路径将在调试控制台的开头打印。 将调试配置中的logOutput属性设置为rpc。将看到对应于在VS Code和delve之间来回传递的RPC消息的日志。请注意,首先需要将showLog设置为true。 logOutput属性对应于delve使用的--log-output标志,可以是一个逗号分隔的组件列表,它应该生成调试输出。 使用源代码调试调试器 如果想深入挖掘并使用此扩展程序的源代码调试调试器,请参阅build-and-debugging-the-extension。 常见问题 调试二进制文件时未验证断点或变量 确保正在调试的二进制文件是在没有优化的情况下构建的。在构建二进制文件时使用标志-gcflags="all = -N -l"。 Cannot find package ".." in any of ... 调试器没有使用正确的GOPATH。这不应该发生,如果确实如此,请记录一个错误。 在记录的错误被解决之前,解决方法是在launch.json文件的env属性中将GOPATH添加为env var。 Failed to continue: "Error: spawn EACCES" dlv从命令行运行得很好,但VS Code提供此访问相关的错误。如果扩展程序试图从错误的位置运行dlv二进制文件,则会发生这种情况。Go扩展首先尝试在$GOPATH/bin中找到dlv,然后在$PATH中找到。 解决方案:在命令行中运行dlv。如果这与GOPATH/bin不匹配,则删除GOPATH/bin中的dlv文件 could not launch process: stat ***/debug.test: no such file or directory 可以在调试控制台中看到此信息,同时尝试在测试模式下运行。当程序属性指向没有测试文件的文件夹时,会发生这种情况。 解决方案:确保程序属性指向包含要运行的测试文件的文件夹 could not launch process: could not fork/exec OSX 由于签名问题,这通常发生在OSX中。请参阅讨论,请参阅#717,#269和derekparker/delve/357 解决方案:可能必须卸载dlv并按照说明手动安装它 Linux/Docker Docker具有安全设置,可以在容器内默认阻止ptrace(2)操作。 解决方案:要不安全地运行容器,请在启动时将--security-opt=seccomp:unconfined传递给docker。参考:derekparker/delve/515 could not launch process: exec: "lldb-server": executable file not found in $PATH 对于使用版本0.12.2或更高版本的版本的Mac用户,此错误可能会显示。不知道为什么,但是做xcode-select --install已经解决了看到这个问题的用户的问题。 远程调试未验证的断点 检查remote delve process使用的delve api的版本,即检查标志-api-version的值。这需要匹配Go扩展程序使用的版本,默认情况下使用版本2。可以通过编辑launch.json文件中的调试配置来更改扩展使用的api版本。 尝试使用终端/命令行中的dlv 将"trace":"log"添加到调试配置并在VS Code中调试。这会将日志发送到调试控制台,可以在其中查看对dlv的实际调用。可以复制并在终端中运行它
智能感知 输入时自动补全(gocode) 输入时显示函数的帮助信息(gogetdoc或者godef+godoc) 鼠标悬停显示信息(gogetdoc或者godef+godoc) 代码导航 跳转或直接i西安市符号的定义(gogetdoc或者godef+godoc) 查看符号的引用和接口的实现(guru) 跳转到文件中的符号或者查看文件大纲(go-outline) 跳转到工作空间中的符号(go-symbols) 在Go程序和相应的测试文件之间切换 代码编辑 用于快速开发的代码片段 手动格式化或者在文件保存时自动格式化代码(goreturns或者goimports或者gofmt) 字符重命名(gorename,注意:重命名后在窗口中执行撤销操作,需要在path中有diff工具) 将导入添加到当前文件中(gopkgs) 在结构体字段上添加或删除标记(gomodifytags) 为接口生成方法stub(impl) 使用默认值填充结构体字段(fillstruct) 诊断 在文件保存时自动编译代码并显示编译错误(go build和go test) 在文件保存时自动运行go vet命令并将错误以警告形式显示 在文件保存时自动分析代码,并将分析错误以警告形式显示(golint,gometalinter,megacheck,golang-ci-lint,revive) 输入时报告语义或者语法错误(gotype-live) 测试 使用命令或者codelens在整个工作空间、当前代码包、当前文件或光标处运行测试 使用命令或者codelines在光标处执行基准测试 根据需要或者在包中运行测试后显示代码覆盖率 生成单元测试框架(gotests)
VS Code使用大量Go工具来提供代码导航,代码完成,构建,分析等功能。 这些工具还没有为Go模块提供良好的支持。 新的语言服务器gopls支持Go Modules。在settings中添加以下内容以使用它。 "go.useLanguageServer": true 注意:使用Go:Install/Update Tools定期更新gopls版本,以便不断获得对语言服务器所做的改进。 使用gopls时VS Code中的已知问题: 无法自动添加未导入的包 查找引用并重命名仅在单个包中生效 更多查看这里: golps已知问题 在这个仓库中的已知问题都带有go-modules标签 要对语言服务器进行故障排除,请参阅故障排除gopls。 如果不想使用语言服务器,请了解并非此扩展所依赖的所有Go工具都支持Go模块。 这里是Go工具团队用来跟踪各种Go工具中Go模块支持更新的问题列表。 FAQ 使用Go模块时可以使用语言服务器吗? 可以,这是VS Code中模块支持的前进之路。请注意语言服务器本身处于alpha模式,正在进行活动开发。有关详细信息,请参阅此问题上方的部分。 使用Go模块时,为什么代码导航和代码补全速度会变慢? 使用Google的语言服务器时,代码导航和代码补全肯定会更好。所以,请试一试。如果不使用语言服务器,那么这主要由于godef和gocode的限制。Google的Go工具团队正在开发一种语言服务器,它将成为所有语言功能的长期解决方案。请按照本页第一部分的说明试用语言服务器。 如果不想使用语言服务器: 如果代码补全缓慢,请在gocode仓库中记录一个问题。 如果代码导航速度慢,请在godef仓库中记录问题,或者如果在设置中选择了gogetdoc,请在`gogetdoc仓库`中记录问题。 文件保存时不再自动导入。为什么? 如果不使用语言服务器,则此扩展程序默认使用goreturns工具格式化文件并自动导入缺失的包。由于此工具不支持模块,因此文件保存中的自动导入功能不再有效。添加设置"go.formatTool":"goimports",然后使用Go:Install/Update Tools来安装/更新goimports,因为它最近添加了对模块的支持。
VS Code的Go扩展程序提供了安装在GOPATH中的各种Go工具。 其中有一些工具负责通用的编程语言功能,如: 代码导航 自动补全 符号搜索 另外的一些工具对Go扩展程序来说是可选的,它们提供日常的语言支持。 以下是Go扩展程序的常用功能必须用到的工具。如果已经选择使用Go语言的服务器,那么就不需要以下大部分的工具了,因为在Go语言服务器中将会提供相应的功能。 注意:如果使用的是Go Modules,那么强烈建议使用Go语言服务器,因为它的性能要比下面的工具强很多。 Go 工具 gocode:自动补全(如果使用语言服务器则不需要这个工具) go-outline:在当前文件中进行变量搜索 go-symbols:在当前工作区进行变量搜索 gopkgs:自动导入依赖的包 guru:查找所有引用 gorename:变量重命名 goreturns或者goimports:格式化代码((如果使用语言服务器则不需要这个工具)) godef或者gogetdoc:跳转到定义(如果使用语言服务器则不需要这个工具) godoc或者gogetdoc:鼠标悬停时显示文档(如果使用语言服务器则不需要这个工具) golint或者gometalinter或者megacheck或者golangci-lint或者revive:用于代码分析 dlv:用于调试 如果其中的某个工具缺失时,将在编辑区的右下角看到Analysis Tools Missing的警告。单击该警告时VSCode或帮助安装缺少的工具。 Go语言的这个扩展程序还有其他的功能,虽然不是每天都使用这些功能。例如,生成单元测试、生成接口的stub或修改stub的标签。用于实现这些功能的工具如下: gomodifytags:修改结构体的标签 goplay:在Go playground中运行当前文件 impl:生成接口的stub gotype-live:给自定义类型提供诊断 gotests:生成单元测试 go-langserver:通过Sourcegraph来使用Go语言服务器 fillstruct:使用默认值填充结构体中变量 可以通过运行命令Go: Install/Update Tools立即安装所以工具,如果更改了正在使用的Go版本,同样使用这个命令使工具保持最新的同时重新编译。 如果希望扩展程序使用单独的GOPATH来存放这些Go工具,在配置文件setting.json的go.toolsGopath参数中设置希望的存储路径。 在当前GOPATH中手动安装这些工具,只要拷贝下面的指令并在终端中运行即可: go get -u -v github.com/ramya-rao-a/go-outline go get -u -v github.com/acroca/go-symbols go get -u -v github.com/mdempsky/gocode go get -u -v github.com/rogpeppe/godef go get -u -v golang.org/x/tools/cmd/godoc go get -u -v github.com/zmb3/gogetdoc go get -u -v golang.org/x/lint/golint go get -u -v github.com/fatih/gomodifytags go get -u -v golang.org/x/tools/cmd/gorename go get -u -v sourcegraph.com/sqs/goreturns go get -u -v golang.org/x/tools/cmd/goimports go get -u -v github.com/cweill/gotests/... go get -u -v golang.org/x/tools/cmd/guru go get -u -v github.com/josharian/impl go get -u -v github.com/haya14busa/goplay/cmd/goplay go get -u -v github.com/uudashr/gopkgs/cmd/gopkgs go get -u -v github.com/davidrjenni/reftools/cmd/fillstruct go get -u -v github.com/alecthomas/gometalinter gometalinter --install 安装调试工具:delve查看这篇指南。 按照一下步骤在Linux系统中编译和安装调试: 方式一: go get -u github.com/go-delve/delve/cmd/dlv 方式二: 首先保证GOPATH环境变量已经设置好。 git clone https://github.com/go-delve/delve.git $GOPATH/src/github.com/go-delve/delve cd $GOPATH/src/github.com/go-delve/delve make install 注意:如果使用Go1.5版本,那么必须先设置GO15VENDOREXPERIMENT=1`才能继续。
安装了扩展程序,但是没有任何功能正常工作? 检查是否安装了所有依赖的Go工具。执行Go: Install/Update Tools命令。如果希望只是安装指定的工具,查看插件依赖的Go工具,然后手动安装需要的工具。 安装工具时显示git pull --ff-only错误? 有可能时因为正在安装的工具库被强制push,删除相关工具在$GOPATH/src(如果设置了go.toolsGopath,相应的路径也需要检查)中的文件夹然后重新安装。 为什么导入的软件包会被删除或者重新排序? 默认情况下,扩展程序会格式化代码并重新组织每个文件中导入的包(添加缺失的包、删除未用的包、重新排序导入包)。可以通过下面的设置来关闭整个功能。 如果没有使用gopls语言服务器,可以添加"go.formatTools": "gofmt到设置中来选择一个格式化工具或者禁用导入时格式化功能: "[go]": { "editor.formatOnSave": false } 如果使用gopls语言服务器,那么重新组织导入的功能在格式化进程之外执行。要在这种情况下禁用整个功能,添加如下的设置: "[go]": { "editor.codeActionsOnSave": { "source.organizeImports": false } } 为什么在保存文件时,空格被替换为制表符? 因为此扩展程序使用的格式化工具goreturns,goimports或gofmt都遵循使用制表符而不是空格的规则。 格式化工具中一个制表符的大小是否为8? 在VSCode中制表符的默认大小是4,要在每个Go文件中将制表符大小修改为8,那么添加如下配置: "[go]": { "editor.tabSize": 8 } 扩展程序如何确定要使用的GOPATH? 查看扩展程序中设置GOPATH。 VSCode 是否支持 Go Modules? 查看VSCode支持Go-Models。 使用Go Modules时,为什么代码导航和代码完成速度会变慢? 查看VSCode支持Go-Models。 使用Go Modules时可以受用语言服务器吗? 查看VSCode中使用Go语言服务器。 如何仅仅运行代码而不是调试代码? 使用快捷键Ctrl+F5或者执行Debug: Start without Debugging命令。 在这种场景下,我们使用go run指定一个文件路径。因此: 如果已经有一个带有默认配置的launch.json文件,请将其更新为使用${file}而不是${fileDirname} 如果使用自定义的调试配置,请配置的程序属性指向文件为不是目录 如果程序属性中没有指定文件路径,那么Start without Debugging命令将会恢复到正常的调试。 为什么在终端中设置的GOPATH没有被插件使用?为什么程序没有获取在终端中设置的环境变量? 扩展程序运行在一个独立的进程中而不是在终端或者VSCode窗口的其他部分。因此在终端中设置的环境变量对于扩展程序时不可见的。 在哪里可以查看到扩展程序的日志? 在View菜单中选择Output,将显示输出面板。在此面板的右上角,从下拉列表中选择Log(Extension Host)。提示:如果在执行特定操作后查找日志,请先清除日志并再次尝试以降低其他日志的干扰。 自动补全功能不生效了,咋整? 首先检查日志中的错误。 如果正在使用Go语言服务器,那么上一步中的输出窗口面板的下拉带单中有与一个关于语言服务器的条目,选择并查看它的输出。 如果没有没有使用Go语言服务器, 并且这是第三方的包,首先确定是否安装了。可以通过执行Go: Build Current Package命令,这样将会安装所有的依赖,后者手动安装所有的依赖通过命令go install。 如果依然不起作用,在终端中执行gocode close或者gocode exit然后再试一次。如果使用Go Modules,那么使用gocode-gomod而不是gocode。 如果依然不起作用,执行Go: Install/Updata Tools,选择gocode来更新这些工具。如果使用Go Modules,那么使用gocode-gomod而不是gocode。 如果依然不起作用,在终端中执行gocode -s -debug后立即执行gocode close或者gocode exit然后再试一次。gocode的结果将输出再终端中。如果使用Go Modules,那么使用gocode-gomod而不是gocode。 如果再终端中看到预期的结果,但是在VSCode中没有预期的结果,那么在vscode-go的仓库和gocode的仓库中开一个issue。如果使用Go Modules在这里中开一个issue。 为什么在文件保存时格式化不生效? 查看日志(操作见问题12),具体的消息如"Formatting took too long"或者Format On Save feature could be aborted。如果看到此类消息,很大概率因为格式化花太长时间而被中止,这影响到了保存体验。可以设置editor.formatOnSaveTimeout来控制超时参数。 导入的包有红色的下划线显示“包未找到”? 这些是构建错误,点击View->Output->从面板右上角的下拉菜单中选择go。然后就可以看到go build的输出(或者是go test的输出,如果当前文件时测试文件)。将go build命令和参数一起拷贝后尝试在终端中运行。如果仍然看到相同的错误,那么问题在于GOPATH的设置。如果它运行正常,那么提交一个issue。 如何获取已实现但尚未发布的功能/错误修复程序?如何获得Go扩展的测试版? 查看安装测试版本
在任何使用都可以使用Go: Current GOPATH命令来查看扩展程序使用的GOPATH。 从环境变量获得GOPATH 开箱即用,扩展程序使用环境变量GOPATH中设置的值。从Go1.8版本开始,如果没有设置这个环境变量,那么会使用go env中描述的GOPATH值。 通过go.gopath设置GOPATH 在用户设置中设置go.gopath会覆盖从上面的逻辑中派生的GOPATH。 在工作空间中设置go.gopath会覆盖用户设置中的go.gopath。可以在此文件中将多个文件夹目录设置为GOPATH。 注意,多个目录之间使用:分隔(在window系统中使用;分隔)。 通过go.inferGopath设置GOPATH 设置go.interGopath会覆盖在go.gopath中设置的值。 如果go.inferGopath设置为true,那么扩展程序将会尝试从工作空间(例如,VSCode中打开的目录)的路径中推断GOPATH。扩展程序会从src目录的路径开始向上搜索,并将GOPATH设置为高于该目录的一个级别,其中也包括全局的GOPATH。 运行命令go env GOPATH来查找全局的GOPATH。 例如,如果项目是这样的/aaa/bbb/ccc/src/...,那么打开目录/aaa/bbb/ccc/src或者其中的任何子内容,都将会导致扩展程序自动向上搜索,在路径中找到src目录,然后将GOPATH设置为高于它一个级别的值,即GOPATH=/aaa/bbb/ccc 当处理具有不同GOPATH的Go项目时,这个设置非常有用。 不需要在每个工作空间中设置GOPATH,也不需要在工作空间中设置全部的目录然后用:或;来分隔。 只需要将go.inferGopath设置为true,扩展程序就会自动搜索并使用正确的GOPATH。 通过go.toolsGopath设置Go工具的GOPATH 使用go get命令在GOPATH中安装Go工具,要防止Go工具扰乱GOPATH,可以使用go.toolsGopath设置来提供单独的GOPATH仅用于Go工具。 第一次设置go.toolsGopath时,需要运行GO: Install/Update Tools命令,这样Go工具就能够安装在指定的位置。 如果没有设置go.toolsGopath或者在它指定的位置没有找到Go工具,那么会使用上面几节中描述的逻辑来找GOPATH中的Go工具。如果在那里也没有找到Go工具,那么就会在路径找中查找,这些路径时PATH环境变量的一部分。
Go扩展程序默认在每个文件保存时运行以下命令,可以在设置中关闭。 构建:go.buildOnSave 分析:go.lintOnSave 审查:go.vetOnSave 格式化:如下参数 "[go]": { "editor.formatOnSave": false } 在设置中开启后,当文件保存时可以运行下面的功能: 测试 代码覆盖率 保存时构建 在每个文件保存时,构建文件所属的包来查找任何编译错误。如果此文件是测试文件,那么将执行 go test -i -c -o 而不是 go build -i -o。 构建过程生成的二进制文件被写入临时位置,因为此处的目的是仅查找编译错误而不提供二进制文件/可执行文件。 通过以下参数控制保存时构建: go.buildOnSave:使用此参数既可以用来关闭保存时构建功能,也可以修改为在包级别或者工作空间级别的保存时构建。 go.buildTags:此处的标签用于构建(build)和审查(vet)进程,就像其他被本扩展程序使用的Go工具那样使用-tags标志。 go.buildFlags:被构建和测试进程使用。 go.installDependenciesWhenBuilding: 默认情况下,传递-i标志来加速构建过程 如果不想使用-i标志,就将go.installDependenciesWhenBuilding设置为false 保存时分析 分析器(linter)时一种提供编码风格反馈和建议的工具。默认情况下,此扩展程序使用官方提供的golint`作为分析器。 可以通过在设置中修改golintTool参数为gometalinter来使用更高端的Go Meta Linter替代默认的分析器。 注:gometalinter已经弃用,更高级的版本是golangci-lint。 Go Meta Linter是多种由本扩展程序安装的分析器的集合。 几个非常有用的分析工具如下: errcheck:检查代码中的未检查错误 varcheck:查找未使用的全局变量和常量 deadcode:查找未使用的代码 如果只需要使用其中某个分析器(某些分析器很慢),可以通过修改配置来指定: "go.lintFlags": ["--disable-all", "--enable=errcheck"], 或者,可以使用megacheck,它比gometalinter性能更好,同事只支持工具的子集。 要在保存时禁用分析,则关闭go.lintOnSave。 保存时格式化 如果开启了自动保存功能,那可能需要关闭保存时格式化功能,这样就可以避免代码不断的变化,可以通过修改如下配置: "[go]": { "editor.formatOnSave": false } 默认情况下,使用goreturns工具进行格式化,可以通过修改go.formatTool参数来更换为goimports或者gofmt工具。 如果发现未使用的导入自动消失了或者未导入的包自动添加了,这就是goreturns工具在背后起作用。
测试Go扩展程序的先决条件如下,如果还没有安装Go和本扩展程序: 安装Go 执行go get github.com/golang/example/hello命令 在侧栏导入Go扩展程序然后在VSCode中打开$HOME/go/src/github.com/golang/example文件夹 打开任意的一个Go文件,在状态栏会看到Analysis Tools Missing的提示,点击该提示来安装扩展程序需要的G0工具 烟囱测试的功能 从当前/标准/第三方的软件包中尝试函数,结构和接口的以下功能: 跳转到或者悬停定义 查找引用 悬停信息 在内置函数(fmt,strings,math等)和自定义包(hello项目中的stringutil)中尝试以下功能: 自动补全 自定补全未导入的包 将go.useCodeSnippetsOnFunctionSuggest设置为true然后检查代码片段是否显示 函数签名帮助 启用保存时构建,审查,分析和格式化的功能,在go文件中进行更改并保存。尝试设置值的范围为“package”和“workspace”: Go的输出通道应显示构建,审查和分析结果 如果有错误,红色波浪线应显示在编辑器中 删除导出成员(名称以大写字母开头)的注释,并检查分析器要求添加的注释 添加标签和额外的行并且删除导入:格式化功能应该会修复这些地方 重命名: 重命名一个局部变量,重命名将会生效然后文件进入脏状态 重命名一个导出函数(例如,从hello项目中导入),重命名将会跨文件生效,所有受影响的文件都应该打开并处于脏状态 添加导入: 命令:Go: Add import应该会显示一个可以被导入的包列表 选择其中一个应该向当前go文件添加导入 当前文件中已导入的包不应显示在列表中 其他功能: 文件大纲 调试
从命令面板中调用Task: Configure Task Runner。 这将在工作空间(.vscode)文件夹中级工创建task.json文件,用下面的内容替换自动生成的JSON文件中的内容。 { "version": "0.1.0", "command": "go", "isShellCommand": true, "showOutput": "silent", "tasks": [ { "taskName": "install", "args": [ "-v", "./..."], "isBuildCommand": true }, { "taskName": "test", "args": [ "-v", "./..."], "isTestCommand": true } ] } {{ "version": "2.0.0", "type": "shell", "echoCommand": true, "cwd": "${workspaceFolder}", "tasks": [ { "label": "rungo", "command": "go run ${file}", "group": { "kind": "build", "isDefault": true } }, ] } 通过 ctrl + shift + b 来运行 go install -v ./... 并且会在输出窗口中返回结果 通过 ctrl + shift + t 来运行 go test -v ./... 并且会在输出窗口中返回结果 可以使用同样的技巧来调用其他构建和测试工具。例如,在makefile中定义构建过程,则调用makefile目标,或者调用类似go generate之类的工具。 有关在VSCode中配置任务的更多信息,查看这里。 可以定义特殊的仅运行某些测试的任务: { "version": "0.1.0", "command": "go", "isShellCommand": true, "showOutput": "silent", "suppressTaskName": true, "tasks": [ { "taskName": "Full test suite", "args": [ "test", "v", "./..."] }, { "taskName": "Blog User test suite", "args": [ "test", "./...", "-test.v", "-test.run", "User"] } ] } 该任务将会用User中的名字来运行所有的测试。
如果想要尝试从主分支中构建测试版的Go扩展程序,可以按照如下说明进行操作: 从这里下载vsix文件 执行code --install-extension Go-katest.vsix命令 重启VSCode 注意:没有自动更新机制来自动安装最新的测试版。
Go扩展程序使用大量Go工具来提供各种语言功能。另一种方法是使用单一语言服务器,该服务器使用语言服务器协议提供相同的功能。 以前,我们添加了对使用go-langserver(Sourcegraph的语言服务器)的支持。它不再有活跃的开发,它不支持Go模块。因此,现在转而使用gopls,Google的语言服务器,目前正在积极开发中。 如果已经使用·Sourcegraph·中的语言服务器,只要不使用Go模块,就可以继续使用它。建议继续使用gopls。 为此,请删除计算机中的go-langserver二进制文件/可执行文件,此扩展程序将在重新加载VS Code窗口后提示安装gopls。 由于Google的语言服务器为Go模块提供了更好的支持,当扩展程序检测到正在使用Go模块的项目时,系统会进行提示。 如果之前从未使用过语言服务器,现在选择使用它,只要使用Go版本 > 1.10,系统就会提示安装并使用Google提供的语言服务器 设置以控制Go语言服务器 以下是可用于控制语言服务器使用的设置。需要重新加载VS Code窗口才能使这些设置中的任何更改生效。 将go.useLanguageServer设置为true以启用语言服务器 使用go.languageServerExperimentalFeatures设置来控制希望语言服务器为哪些功能提供支持。 设置"go.languageServerFlags":[" - logfile",“已存在的文本文件的路径"]以收集日志文件中的日志。 设置"go.languageServerFlags":[" - rrp.trace"]以在输出面板中查看完整的rpc跟踪(View->Output->gopls) 设置更改正在使用的语言服务器 如果想尝试其他语言服务器,例如bingo,请安装它并添加以下设置 "go.alternateTools": { "gopls": "bingo" } 这将告诉Go扩展使用bingo代替gopls。 提供关于gopls的反馈 如果在使用gopls语言服务器时发现任何问题,请首先查看gopls的现有问题列表,并在登记新案例之前更新相关已经有案例,网址为 https://github.com/golang/go/issues gopls的有用链接 Wiki for gopls Troubleshooting for gopls Known bugs with gopls Github issues for gopls