本文介绍:

  • 在 windows 平台使用 vscode 搭建 golang 环境
  • GOPATH 和 go mod 区别
  • vscode 中同一工作区编写多个 go 文件时 gopls 报错的解决方法
  • vscode 中使用 go 语言单元测试,比如刷算法题的目录结构

目录:

安装教程

1. 首先下载 go 安装包,官网链接

然后傻瓜式安装,记得注意一下安装路径

2. 然后设置环境变量 (按理说安装的时候会自动设置,如果没有设置,就手动设置一下)

接着命令行执行 go version, 有输出版本就成功了

Tips: 因为众所周知的原因,最好先设置 go env 再安装 vscode 的插件

命令行设置一下 go env

bash
1
2
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct

3. 然后在 vscode 中安装 go 的开发插件 Go : Rich Go language support for Visual Studio Code
这个插件集成了代码补全 / 检查等功能

然后 Ctrl + Shift + P, 输入 go, 点击 Go: update/install tools

全选安装,等待完成即可

4. 然后在 vscode 的全局设置 setting.json(点击左下角设置,然后在设置页面的右上角点击文件图标,进入 setting.json) 的底部添加如下

json
1
2
3
4
5
6
7
"go.autocompleteUnimportedPackages": true,
"go.gocodePackageLookupMode": "go",
"go.gotoSymbol.includeImports": true,
"go.useCodeSnippetsOnFunctionSuggest": true,
"go.inferGopath": false, // use go mod, banning gopath
"go.useCodeSnippetsOnFunctionSuggestWithoutType": true,
"go.goroot":"E:\\go_windows_amd64\\go", // indicate where is go interpreter

运行和调试 go 程序

写代码时,在代码目录命令行执行如下来初始化

bash
1
2
3
4
# 初始化go mod包管理器
go mod init
# 自动下载和清楚所需要的包
go mod tidy

在命令行运行代码时,有如下俩方法

bash
1
2
# 直接执行脚本, 类似于python
go run filename.go
bash
1
2
3
# 先编译再执行可执行文件, 类似于C++/Java
go build filename.go
./filename.exe

如果要使用 vscode 的界面调试,在工作区根目录创建.vscode/launch.json 如下

json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{
"version": "0.2.0",
"configurations": [
{ //自动检测, 有断点就是debug, 没断点就是test
"name": "go auto",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "${fileDirname}"
},
{ //执行可执行文件
"name": "go exec",
"type": "go",
"request": "launch",
"mode": "exec",
"program": "${fileDirname}"
},
{ //debug
"name": "go debug",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "${fileDirname}"
},
{ //test
"name": "go test",
"type": "go",
"request": "launch",
"mode": "test",
"program": "${fileDirname}"
}
]
}

这样在运行调试一栏,我们就可以看到如下三种,点击即可运行

img

运行 helloworld 之后,和 cpp 不一样的是,输出不在终端,而在调试控制台,如下

img

使用单元测试 test 写代码

有时候我们需要写很多小的单元测试,比如刷算法题

单元测试是通过在测试文件中编写测试函数来实现的.

  • 测试函数必须以 Test 开头,并且接受一个 * testing.T 类型的参数
  • 测试文件的代码必须 import “testing”
  • 测试文件必须以_test 结尾

此外,在 Go 语言中,一个文件夹下只能有一个 package. 这是因为 Go 语言的编译器和构建工具都是基于文件夹的,它们会将同一个文件夹下的所有 Go 源文件编译为一个包。因此,如果一个文件夹下有多个 package, 编译器将无法确定哪个 package 应该被编译.

因此,我们的测试项目结构可以如下这样

img

其中,go.work 如下 (go work init 自动生成)

go
1
2
3
go 1.20

use ./go_learn/

go.mod 如下 (go mod init 自动生成)

go
1
2
3
module learn

go 1.20

hello_test.go 如下

go
1
2
3
4
5
6
7
8
9
10
package hello

import (
"fmt"
"testing"
)

func Test_basic(t *testing.T) {
fmt.Println("hello world")
}

此时 vscode 上会弹出这些图标,点击即可运行

img

初学者容易踩的坑

  • GOPATH 是什么:老版本 go 的环境变量,之前所有的包都丢在 GOPATH 中。这个在 go 1.17 已被弃用。新版本安装 go 完全不需要这个东西,看到有这个设置的教程说明已经过时了,直接忽略并换一篇教程即可.
  • go mod 是什么: go 1.11 推出的包管理工具,即 go module, 用于取代 GOPATH. 截止目前 2023.4, 这个是主流
  • 在 vscode 中编写多个不同文件夹的 go 程序时 (比如用 go 刷算法题), 会报错 gopls was not able to find modules in your workspace, 因为 gopls 是从我们打开的工作区文件夹来寻找 mod 的,我们只需要在工作区根目录执行 go work init ./<你的子文件夹> 即可,之后会生成 go.work 文件,在里面指定子文件夹位置即可.
  • 此外,一个文件夹里面只能有一个 package (不同文件可以用相同的 package)
  • vscode 对 go 进行 debug 和运行找不到输出,因为输出不在终端,详见上图.
  • No tests found. Current file is not a test file. 文件名必须命名为_test 结尾
  • func main is unused (U1000) 这个算警告,而不是报错,不理他就行

参考文章
https://www.zhihu.com/tardis/zm/art/262984879
https://blog.csdn.net/wsi__/article/details/127348785
https://cloud.tencent.com/developer/article/2028975
https://learn.microsoft.com/zh-cn/azure/developer/go/configure-visual-studio-code