本文介绍:

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

目录:

安装教程

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

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

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

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

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

命令行设置一下go env

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) 的底部添加如下

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程序

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

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

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

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

如果要使用vscode的界面调试, 在工作区根目录创建.vscode/launch.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自动生成)

1
2
3
go 1.20

use ./go_learn/

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

1
2
3
module learn

go 1.20

hello_test.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