GoLand 默认不删除空行,因 gofmt 和 goimports 遵循 Go 官方规范,允许函数间、结构体字段间保留空行;需改用 gofumpt 并在 GoLand 中配置自定义格式化命令实现空行清理。

GoLand 默认不删空行,gofmt 本身就不处理这个
gofmt 和 goimports 都遵循 Go 官方格式规范,而该规范**明确允许函数间、结构体字段间保留空行**。所以无论你怎么配,只要用的是原生工具,保存时都不会自动删多余空行——这不是 bug,是设计如此。
想删空行,得换更激进的格式化器,比如 gofumpt。它不是 Go 官方工具,但被广泛接受为“严格版 gofmt”,默认启用 -s(简化模式)并额外删除冗余空行、合并变量声明等。
- 安装:
go install mvdan.cc/gofumpt@latest - 验证:
gofumpt -version能输出版本即成功 - 确保
$GOPATH/bin或$GOBIN在系统 PATH 中(终端能直接运行gofumpt)
GoLand 中切换 formatTool 为 gofumpt
GoLand 不像 VS Code 那样直接暴露 go.formatTool 设置项,必须手动指定可执行路径:
- 打开 Settings → Languages & Frameworks → Go → Formatting
- 取消勾选 “Run gofmt” 和 “Run goimports”
- 勾选 “Use custom formatting command”,点击右侧
…按钮 - 在弹出窗口中,Program 填
gofumpt(或完整路径,如/home/xxx/go/bin/gofumpt) - Arguments 填
-w $FilePath$($FilePath$是 GoLand 内置宏,代表当前文件绝对路径) - 确认 “Reformat on save” 已开启
改完后重启 GoLand,保存 .go 文件时就会调用 gofumpt -w,空行会被清理,import 也会重排(但它不管理 import 增删,这点不如 goimports)。
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
如果既要删空行又要管 import,得组合用
gofumpt 和 goimports 目前无法直接合并成一个命令。常见折中方案有两种:
- 先用 gofumpt 格式化,再用 goimports 整理 import:写个 shell 脚本封装,再配成 GoLand 的 File Watcher(Program 填脚本路径,Arguments 留空)
-
只用 gofumpt,手动补 import:它会保留已有 import,但不会自动加缺失的包——写完代码后按
Ctrl+Alt+O(Windows/Linux)或Cmd+Option+O(macOS)手动组织 import,这个快捷键仍有效
注意:gofumpt 对 go.mod 无依赖,即使项目没模块也能跑;但如果你开了 replace 或 vendor,goimports 的 import 分组可能更准,gofumpt 则只做纯语法层面整理。
CI 和 pre-commit 里别漏掉 gofumpt
本地用了 gofumpt,CI 就不能只跑 go fmt -l,否则会因风格不一致失败:
- CI 检查命令换成:
gofumpt -l ./...(注意是./...,递归所有子模块) - pre-commit hook 脚本里也替换为
gofumpt -w,否则提交时格式和 CI 不一致 - 团队成员必须统一用
gofumpt,否则 PR 里会反复出现空行增删的 diff
真正容易被忽略的是:GoLand 的 File Watcher 如果配置了多个监听器(比如同时启用了 gofmt 和 gofumpt),它们会冲突。删掉所有其他 Go 格式化 watcher,只留一个 gofumpt 的,不然保存一次可能触发两次格式化,结果不可控。

















