goimports 可自动清理无用 import 并管理分组排序,而 gofmt 仅处理语法格式、不感知 import;需通过 file watchers 配置 -w 参数,并确保项目含 go.mod 且 module path 正确。

保存时自动清理无用 import,必须用 goimports,不能只靠 GoLand 内置格式器或 gofmt——后者根本不会删包、加包、分组或排序。
为什么 gofmt 不行,而 goimports 可以
gofmt 只处理缩进、空格、括号换行等纯语法格式,对 import 块完全不感知:它不会删掉未使用的包,也不会按标准分组(标准库 / 第三方 / 本地),更不会自动补全新引入的包。而 goimports 是它的超集,在 gofmt 基础上额外做了 import 管理——这才是你真正需要的行为。
- 删掉代码里没
import的包(哪怕go.mod里还留着) - 新增当前文件实际用到、但
go.mod尚未声明的模块(触发go mod tidy类似逻辑) - 把 import 拆成三段:标准库、非标准但非本地、本地路径(如
./internal) - 自动按字母序排序每一段
File Watchers 必须正确配置 goimports
GoLand 不会默认启用保存即清理 import,你得手动配 File Watchers,且参数错一个就静默失败——连报错都没有。
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
-
Program:填goimports(不是gofmt,也不是带路径的完整路径,除非你非要写死) -
Arguments:填-w $FilePath$(-w表示写回原文件,$FilePath$是 GoLand 变量,代表当前保存的文件) -
Working directory:设为$ProjectFileDir$(确保goimports能找到项目根目录下的go.mod) - 勾选
Auto-save edited files to trigger the watcher和Trigger the watcher on external changes - 确认
goimports已安装:go install golang.org/x/tools/cmd/goimports@latest,且$GOPATH/bin在$PATH中
go.mod 缺失或路径不对,goimports 直接跳过 import 处理
goimports 不是文本替换工具,它依赖 Go 模块系统做语义分析。如果它找不到 go.mod,就会退化为纯 gofmt 行为——import 块原封不动。
- 项目必须在含
go.mod的目录下打开(不是子目录,比如不要打开project/internal/而跳过根) - 若用多模块结构(如
cmd/和pkg/各有go.mod),需确保当前文件属于某个模块的go.mod范围内 - 没有
go.mod的目录里,goimports -w仍会格式化代码,但 import 块完全不动 - 验证方式:删掉一个已用的
import,保存,看是否自动加回来;再加一个未用的,保存,看是否被删
Code Style 里的 Enable formatter 也得开
这个开关控制的是“编辑器内部格式化能力”,和 File Watchers 是两条链路。只开它,Ctrl+Alt+L 会调用 IDE 内置格式器(不碰 import);只开 File Watchers 但关了它,部分场景下 watcher 可能不触发。
- 路径:
Settings → Editor → Code Style → Go,勾选Enable formatter - 它不影响保存行为本身,但影响 IDE 对格式化结果的感知和高亮反馈
- 不开这个,有时会出现“保存后看起来没变化”,其实是 IDE 没刷新格式化状态,而非
goimports没跑
最常被忽略的一点:goimports 的 import 分组逻辑严格依赖 go.mod 里的 module path。如果 module 声明是 example.com/foo,但你写了 import "./bar",它可能无法识别这是本地包——结果就是 import 被扔进第三方组,甚至被误删。别指望它猜意图,它只认模块定义和路径匹配。










