在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下载的。

然后我发现golintgolangci-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的文件监视器看起来像这样:

image

希望这能为其他人节省一点时间。

顺便说一下,我是在尝试使用vscode进行Go开发失败后才这么做的。vscode内置了golint,我看到了一堆烦人的消息,指出我懒得去做的事情。上面的记录是我回到GoLand后,试图获得相同lint行为的尝试。

我已经使用Goland好几年了(享受了完整的续订折扣,谢谢!),但人们一直在谈论vscode有多棒(以及它是,你知道的,免费的)。所以我试了一下。它还行,但最终它似乎没有做到Goland做的所有事情(例如,重构包目录对我来说效果不太好),所以我回到了这个似乎真正理解这门语言的IDE。

如果你谷歌“vscode vs GoLand”,你会发现很多人和我有同感。就像很多事情一样,一分钱一分货!


2 回复

我将这篇帖子发送给了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的完整重构功能。

回到顶部