GoLand 2025.3 Help

代码检查

在 GoLand 中,有一套代码检查可以在编译项目之前检测和纠正异常代码。 该 IDE 可以查找并高亮显示各种问题,定位无用代码,查找可能的错误、拼写问题,并改善整体代码结构。

检查可以在所有项目文件中扫描您的代码,或仅在特定 范围 内进行扫描(例如,仅在生产代码或已修改的文件中)。

每个检查都有一个 严重性级别——该级别表示问题在多大程度上会影响您的代码。 在编辑器中,严重性以不同方式高亮显示,以便您可以快速区分严重问题和次要问题。 GoLand 自带一组预定义的严重性级别,并允许您创建自己的级别。

检查及其设置被归类于 profiles中。 每个配置文件包含已启用检查的信息、其分析的文件范围以及严重性级别。

访问所有可用的检查及其设置

  • 设置 对话框(Ctrl+Alt+S ),转到 编辑器 | 检查

    您也可以按 Ctrl+Alt+Shift+H 并在弹出窗口中选择 配置检查

    检查列表及其设置

请使用 筛选图标 筛选检查列表。 例如,您可以按严重性或语言筛选检测。

数据流分析

数据流分析(DFA)是一种用于编程的方法,用于理解数据如何在程序中流动。 将您的程序想象成一个带有不同点的地图,每个点都是代码的一部分(例如语句或指令)。 这些点通过线连接,显示程序运行时的路径。 在 GoLand 中,数据流分析会查看这张地图以分析您的代码。

DFA 检查及其设置的列表

nil 解引用的数据流分析

nil 指针解引用是 Go 中常见的错误。 这可能会导致生产系统中出现意外的 panic、崩溃或死锁。 典型原因包括访问 nil 指针的字段或向 nil 通道写入数据。

GoLand 使用静态代码分析来检测 nil 解引用问题。 标准 nil 解引用检查在单个函数内执行(过程内分析),可捕获简单情况。

当 nil 值跨函数、文件或软件包传递时,会出现更复杂的问题。 为识别这些问题,GoLand 提供跨过程 DFA。 此功能可跟踪值如何在函数调用中传播,从而可以在整个代码库中检测潜在的 nil 解引用问题。

有关过程内分析的更多信息,请参阅 blog.jetbrains.com 上的博文

解释潜在的 nil 解引用

GoLand 可在编辑器中直接高亮标示可能的 nil 解引用问题。 出现此类警告时,您可以使用 Explain potential nil dereference 操作。

  • 将鼠标悬停在警告上,或点击警告并按 Alt+Enter ,选择 Explain potential nil dereference

    解释潜在的 nil 解引用

    此操作将在 问题 工具窗口中打开 Go DFA 选项卡。 该工具会逐步解释 nil 值如何在代码中传播及其使用位置。 这有助于您了解问题并高效修复,无需在整个代码库中查找。

    在 GoLand 中解释潜在的 nil 解引用

在快速文档中查看 nilability 信息

GoLand 现在在快速文档弹出窗口中直接显示 nilability 信息。 这有助于您快速查看函数是否可能返回 nil,或是否期望非 nil 的参数或接收者。

  1. 将文本光标置于代码中的函数、参数或接收者上。

  2. 按下 Ctrl+Q 可触发快速文档弹出窗口。 在弹出窗口中,查找 Nilability info 部分。

    快速文档中的 nilability 信息

资源泄漏分析

资源泄漏分析可帮助您识别打开但未正确关闭的资源,例如文件或网络连接。 在 Go 中,此类问题可能导致内存泄漏、性能下降、微妙的 bug 以及系统资源耗尽,从而引发严重的运行时错误。

在 GoLand 中,此检查会在本地分析您的代码,以查找单个函数内潜在的资源泄漏。 它可以检测实现了 io.Closer 接口并由其他函数返回的资源。

资源泄漏检查设置

分析的工作原理

该检查会分析函数中的所有控制流路径,以确保资源被正确关闭。 如果存在至少一条资源未关闭的路径,GoLand 会发出可能发生资源泄漏的警告予以高亮显示。

例如:

func processLogFile(filename string) error { file, err := os.Open(filename) // resource leak if err != nil { return err } info, err := file.Stat() if err != nil { return err // the file is not closed } if info.Size() == 0 { return fmt.Errorf("empty file") // the file is not closed } defer file.Close() _, _ = io.Copy(io.Discard, file) return nil }

此处的问题是存在提前返回,导致文件未被关闭。

未显示警告时

该检查旨在避免产生误报。 如果函数将资源的所有权转移,即资源被传递给程序中可能稍后关闭的其他部分,则不会显示警告。 在这些情况下,GoLand 认为资源已被正确处理。

在以下情况下不会显示警告:

  • 从当前函数返回

  • 在匿名函数中使用

  • 赋值给全局变量

  • 存储在 struct、切片或 map 中

例如,以下函数不会触发警告:

func createFile() io.Closer { f, _ := os.Open("/data/source.db") return f // ownership is transferred }

使用重新赋值检测泄漏

该检查还可以检测由重新赋值引起的泄漏。 例如:

func _() { f, _ := os.Open("/data/source.db") // resource leak! if true { f, _ = os.Open("/data/source.db") } f.Close() }

此处,第一次 openFile() 调用返回的资源从未关闭,因为在调用 Close() 之前,变量 f 被重新赋值了。

使用 Qodana 进行代码检查

安装 Qodana 插件

此功能依赖于 Qodana插件,您需要安装并启用它。

  1. 按下 Ctrl+Alt+S 打开设置,然后选择 插件

  2. 打开 Marketplace 选项卡,找到 Qodana插件,然后点击 安装 (如果提示,请重启 IDE)。

除了在您的 IDE 中运行代码检查,您还可以使用 Qodana检查您的代码:

  • 在本地运行 GoLand 检查,包括在 IDE 中运行,并作为 CI/CD 流水线的一部分运行。

  • 使用您的 CI/CD 基础设施运行资源消耗型检查。

  • 在您的 CI 系统中通过质量门控强制执行质量标准。

  • 在 IDE 和 CI 工具中共享相同的检查配置文件。

  • 仅在 Qodana 中提供的访问检查,例如安全检查和许可证审计。

  • 访问检查结果的历史概览。

    您可以比较不同提交之间的检查结果,以更好地了解您的进度。

有关更多信息,请参阅 Qodana

Qodana 报告
最后修改日期: 2025年 12月 5日