在Goland中使用golint的正确姿势
在Goland中使用golint的正确姿势
环境: Ubuntu 18.04, GoLand 2020.1.4, go version go1.14.6 linux/amd64
我决定在GoLand中启用golint。这有点困难。
- 没有为
golint预配置的文件监视器(不过可以手动配置)。 - 预配置的
golangci-lint工具对我来说并不能“直接工作”。当我启用它时,GoLand自动下载了golangci-lint(这花了点时间),但随后给了我运行时错误。 - 当我最终让
golangci-lint工作时,它实际上并没有运行golint(默认禁用)。 - 让工具在自动保存时运行很烦人。
- 让工具只显示错误会过滤掉很多东西。
在golangci-lint的工具网站上,它建议下载二进制文件而不是使用go get。当我这样做时,它开始工作了。我猜GoLand是使用go get -u下载的。
然后我发现golint在golangci-lint中默认没有启用。我启用了它,但仍然没有得到我期望的一些消息。
原来golangci-lint中有一个“神奇”的标志,可以启用golint的所有消息。似乎有一个过滤器会排除某些消息,而有一个标志可以关闭该过滤器。
我现在为golangci-lint设置的文件监视器参数是:
run --disable=typecheck --enable=golint --exclude-use-default=false $FileDir$
--disable=typecheck是GoLand默认配置的(如果我没记错的话,我在几分钟内删除并重新创建了它,我想我弄对了)。--enable=golint启用golint。--exclude-use-default=false关闭了阻止我期望消息的过滤器。
我还关闭了自动保存编辑的文件以触发监视器,并将显示控制台设置为Always。这些是个人偏好,效果可能因人而异。
所以我现在用于golangci-lint的文件监视器看起来像这样:

希望这能为其他人节省一点时间。
顺便说一下,我是在尝试使用vscode进行Go开发失败后才这么做的。vscode内置了golint,我看到了一堆烦人的消息,指出我懒得去做的事情。上面的记录是我回到GoLand后,试图获得相同lint行为的尝试。
我已经使用Goland好几年了(享受了完整的续订折扣,谢谢!),但人们一直在谈论vscode有多棒(以及它是,你知道的,免费的)。所以我试了一下。它还行,但最终它似乎没有做到Goland做的所有事情(例如,重构包目录对我来说效果不太好),所以我回到了这个似乎真正理解这门语言的IDE。
如果你谷歌“vscode vs GoLand”,你会发现很多人和我有同感。就像很多事情一样,一分钱一分货!
我将这篇帖子发送给了JetBrains的好心人,他们指出了以下几点:
golint已经冻结并弃用(自2018年以来没有变化)- GoLand 包含了
golint中的部分检查项 - 可以通过
File | Settings | Editor | Inspections | Go / Go Modules / Go Template访问它们 - GoLand 用户可以通过 YouTrack 来批评或请求检查项
目前,我打算关闭所有 linter,转而探索内置的检查功能。
在GoLand中集成golint确实需要一些配置。以下是基于你的经验总结的配置方法:
1. 安装golangci-lint
# 推荐使用curl安装,避免go get可能的问题
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.54.2
2. GoLand文件监视器配置
在GoLand中配置File Watcher:
参数设置:
run --disable=typecheck --enable=golint --exclude-use-default=false $FileDir$
配置示例:
# .golangci.yml 配置文件示例
linters:
enable:
- golint
disable:
- typecheck
linters-settings:
golint:
min-confidence: 0.8
issues:
exclude-use-default: false
exclude-rules:
- path: _test\.go
linters:
- golint
3. 验证配置
创建测试文件验证配置是否生效:
// main.go - 测试golint检测
package main
import "fmt"
// BadFunc 函数注释应该以函数名开头
func BadFunc() {
var x int = 10 // 冗余的类型声明
fmt.Println(x)
}
// 未导出的函数应该有注释
func unexportedFunc() {
}
运行后应该看到类似输出:
main.go:8:6: exported function BadFunc should have comment or be unexported
main.go:9:9: should omit type int from declaration of x; it will be inferred from the right-hand side
main.go:13:1: comment on exported function BadFunc should be of the form "BadFunc ..."
4. 替代方案:直接使用golint
如果只需要golint,可以直接配置:
# 安装golint
go install golang.org/x/lint/golint@latest
# GoLand文件监视器参数
$FileDir$
5. 性能优化
对于大型项目,可以调整配置:
# .golangci.yml
run:
timeout: 5m
modules-download-mode: readonly
linters:
enable:
- golint
disable-all: true
issues:
max-issues-per-linter: 50
max-same-issues: 5
这样配置后,GoLand会在保存时运行golint检查,提供与VS Code类似的linting体验,同时保持GoLand的完整重构功能。

