goland 不自动删除未使用的 import,需启用“remove unused imports”并用快捷键 ctrl+alt+o(win/linux)或 cmd+option+o(macos)主动清理,它删除未引用的 import、重排顺序、合并路径,但不处理空白导入及隐式引用。

GoLand 里“删 import”不是靠手动删
GoLand 不会自动删掉你代码里没用的 import 语句——它默认只做“格式化”和“组织导入”,不判断“这个包是否真被用了”。比如你写了 import "fmt" 但整段代码里根本没调用 fmt.Println 或任何 fmt 下的符号,GoLand 不会主动把它干掉。
真正起作用的是 Go 编译器和 GoLand 背后集成的 goimports 或 gofmt 工具,它们只管“有没有被显式引用”,不管“有没有被实际调用”。所以你得先让 IDE 知道:哪些 import 是冗余的。
- 确保启用了 “Optimize imports on the fly”(设置 → Editor → General → Auto Import → 勾选)
- 关闭 “Add unambiguous imports on the fly”(避免误加)
- 确认 “Remove unused imports” 已启用(同在 Auto Import 设置页)
快捷键触发“清理导入”最可靠
别等保存或格式化时被动处理,直接用快捷键主动清理当前文件:
-
Windows/Linux:
Ctrl + Alt + O -
macOS:
Cmd + Option + O
这个操作会做三件事:删除未使用的 import、按字母顺序重排剩余导入、合并重复路径(比如把 "fmt" 和 "io" 合并到同一组)。注意:它不会删掉 import _ "net/http/pprof" 这类空白导入——因为 GoLand 默认认为它有副作用(注册 handler),哪怕你代码里根本没开 pprof。
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
为什么有些 import 删不掉?常见卡点
你按下 Ctrl + Alt + O 后发现某个包还在,大概率不是 IDE 问题,而是代码里存在“隐式引用”:
- 函数被赋值给变量:
var f = fmt.Sprintf或var _ = json.Marshal - 类型被嵌入结构体:
type T struct{ io.Reader }→io包会被保留 - 接口实现检查:
var _ io.Writer = &MyWriter{}→io不会删 - 测试文件里用了,但当前打开的是非
_test.go文件 → GoLand 默认只扫当前文件,不跨文件分析
如果想全局扫,得用命令行工具:go mod tidy 只管模块级依赖,go list -f '{{.Imports}}' . 可看当前包所有 import,但真正能定位“未使用包”的是 go vet -vettool=$(which unused)(需先 go install golang.org/x/tools/go/unused@latest)。
删完 import 后必须验证的两件事
删掉 import 不等于项目就安全了。尤其要注意:
-
go build ./必须过——有些包虽没显式调用,但通过init()注册了全局行为(比如database/sql的驱动注册) - 运行
go test ./——很多测试专用包(如github.com/stretchr/testify)只在_test.go里用,删了会导致测试失败
如果你删的是 import "log",但代码里还有 log.Printf,GoLand 会自动补回来;但如果你删的是 import "github.com/sirupsen/logrus",而实际用的是 logrus.WithField,那删了就直接编译报错。关键不在“删”,而在“删之前确认它真没被用”。










