介绍
本教程将讨论使用Visual Studio Code调试Go代码所需的步骤。它将需要安装扩展、分析工具和调试器。
首先,我们将创建一个示例应用程序。然后,我们将探索使用断点和条件断点。
使用此技能组合,您将能够更好地了解应用程序在代码执行中特定点的价值和状态。
先决条件
要完成本教程,您将需要以下内容:
- 对 Go 的理解。要了解更多信息,请查看我们的How To Code in Go系列。
- 去安装在你的机器上。要在您的机器上安装 Go,请按照Go 系列中的教程为您的操作系统设置本地编程环境。
- Visual Studio Code安装在您的机器上。
- 该插件VSCide围棋安装。
安装插件后,.go
在 VS Code 中打开任何文件。状态栏右下角将提示您安装分析工具。单击该链接以安装必要的 Go 包,以使插件高效工作。
我们最终需要安装Delve,一个 Go 的开源调试器。为此,有针对特定平台的详细安装说明。
第 1 步 – 创建示例应用程序
我们将使用两个示例来调试我们的 Go 代码:
- 生成 JSON 文件的 Go 程序。
- 我们将编写一个函数,编写测试,然后看看我们如何在 VS Code 中调试测试。
这是第一个示例的源代码。创建一个文件main.go
:
- nano main.go
将以下内容添加到文件中:
package main
import (
"encoding/json"
"fmt"
"log"
)
// Avenger represents a single hero
type Avenger struct {
RealName string `json:"real_name"`
HeroName string `json:"hero_name"`
Planet string `json:"planet"`
Alive bool `json:"alive"`
}
func (a *Avenger) isAlive() {
a.Alive = true
}
func main() {
avengers := []Avenger{
{
RealName: "Dr. Bruce Banner",
HeroName: "Hulk",
Planet: "Midgard",
},
{
RealName: "Tony Stark",
HeroName: "Iron Man",
Planet: "Midgard",
},
{
RealName: "Thor Odinson",
HeroName: "Thor",
Planet: "Midgard",
},
}
avengers[1].isAlive()
jsonBytes, err := json.Marshal(avengers)
if err != nil {
log.Fatalln(err)
}
fmt.Println(string(jsonBytes))
}
这里我们定义了一个 struct Avenger
,然后创建了一个 Avengers 数组,将其中一个的状态更改为"alive"
,然后将结果转换为 JSON,最后将其打印到 STDOUT。
您可以使用以下命令运行该应用程序:
- go run main.go
它将产生以下输出:
Output[{"real_name":"Dr. Bruce Banner","hero_name":"Hulk","planet":"Midgard","alive":false},{"real_name":"Tony Stark","hero_name":"Iron Man","planet":"Midgard","alive":true},{"real_name":"Thor Odinson","hero_name":"Thor","planet":"Midgard","alive":false}]
第 2 步 – 使用断点调试
要开始调试,我们需要创建一个配置。单击 Visual Studio Code 左窗格中的调试图标。接下来,单击齿轮图标以创建配置。
在.vscode/launch.json
上面显示的内容下创建了一个配置文件。更改配置程序以指向该main.go
文件。在这种情况下,由于我们只有一个main.go
文件,我们可以将其更改为我们的工作区根目录:
{
// ...
"configuration": [
{
// ...
"program": "${workspaceRoot}",
// ...
}
]
}
接下来我们需要添加一个断点,因为这就是调试的全部内容。
让我们通过单击行号左侧的方式在第 21 行( func main()
)上添加一个断点。在那里,您会看到一个红点。
接下来,按下F5
或单击左上角调试部分上带有绿色播放按钮的启动按钮以打开调试视图。
多次单击调试工具栏上的Step Over
按钮。
调试器最终将移至第 40 行。
左侧的调试部分将为我们提供当前断点位置的状态。
我们可以在Variables部分查看特定时间变量的状态或值。
我们还可以看到调用堆栈,此时正在运行的函数是main
函数,以及第 40 行。
您可以继续 Stepping Over,avengers
一旦我们越线,您将看到更改的值。"Tony Stark"
是Alive
。
第 3 步 – 添加条件断点
VS Code 断点为您提供了一个选项来编辑断点,方法是给它们一个表达式,大多数情况下通常是一个布尔表达式。
例如,在第40行,avengers[1].isAlive()
我们可以在这里添加一个条件断点才升起时,表达式的值为true,如avengers[1].Planet == "Earth"
。
为此,请右键单击断点并选择Edit Breakpoint。
如果您没有断点,您仍然可以右键单击,您将被告知添加条件断点。
让我们添加的条件,一旦我们选择上述任何的:avengers[1].Planet == "Earth"
。
现在,如果您使用 启动调试器F5
,它将不会在断点处停止。该应用程序将运行良好,您将在Debug Console 中看到结果。
接下来,编辑代码以符合我们的预期。将托尼·斯塔克的星球改为Earth
:
// ...
{
RealName: "Tony Stark",
HeroName: "Iron Man",
Planet: "Earth",
},
// ...
当我们再次使用 启动调试器时F5
,调试视图打开并且执行在断点处停止。我们可以看到 JSON 没有显示在Debug Console 中。
步骤 4 — 执行进一步的调试测试
让我们在文件中添加一个新函数,启用加法运算:
func add(a, b int) int{
return a+b
}
main_test.go
在同一目录下创建一个测试文件,内容如下:
package main
import "testing"
func Test_add(t *testing.T) {
a, b, c := 1, 2, 3
res := add(a, b)
if res != c {
t.Fail()
}
}
代码只是将两个数字相加,测试只是调用了函数。
但是,如果您安装了 VSCode-Go 插件,您将在测试功能的顶部看到其他选项 –运行测试和调试测试:
您可以单击运行测试来运行测试并在输出窗口中查看结果。
然而,为了调试测试,也许是因为我们无法弄清楚某些事情,我们需要做的就是像之前一样添加一个断点,然后单击debug test。
添加一个断点第10行:if res != c
。然后,单击调试测试。
在调试视图再次被打开,我们可以使用调试工具来跨越和检查上左边的变量部分的状态。
结论
调试是开发软件的关键部分,借助 Visual Studio Code 等工具,我们的生活变得更加轻松。
我们已将调试器添加到示例项目中以解释概念,但您可以随意将调试器添加到任何现有项目中并使用它。您最终将减少fmt.Println
用于记录的语句,以查看代码在执行期间给定点的值或状态。