{"slug": "golangci-lint", "name": "golangci-lint", "category": "other", "category_name": "Other software", "description": "", "recommenders": 4, "commenters": 9, "warners": 4, "score": 0.177, "rising": 1.02, "first": "2025-11-14", "latest": "2026-08-20", "why": "install golangci-lint, turn on errcheck [1], use a pre-commit hook", "why_is_quote": true, "has_verdict": false, "sentiment": {"recommend": 5, "neutral": 2, "compare": 0, "warn": 4}, "spark": [1, 0, 1, 0, 1, 0, 0, 0, 0, 2, 0, 0], "listed": true, "loved": [], "caveat": "", "short_quote": "install golangci-lint, turn on errcheck [1], use a pre-commit hook", "kind": "", "icon": true, "domain": "golangci-lint.run", "github_repo": null, "official_url": "https://golangci-lint.run/", "pricing": "", "aliases": ["golangci-lint"], "verdict": null, "praise": [{"label": "", "summary": "", "quotes": [{"id": 789988992, "item_id": 49374312, "url": "https://news.ycombinator.com/item?id=49374312", "by": "jerf", "date": "2026-08-20", "version": null, "stance": "recommend", "quote": "it would ship with an equivalent of golangci-lint and its open-source ethos of linting from day one", "excerpt": "You, or $YOU, could add that as a linter and integrate it into golangci-lint [1]. There are many things in golangci-lint that I abhor and can't even imagine turning on, things that default to false that I can't imagine working without, and some things I think just bizarre... and everyone will have their own distinct list of such things. While one can argue about the virtues of things being in linters versus in the la", "context": "", "use_case": "Go linting", "switched_from": "", "story": "Go 1.27 Is Released"}, {"id": 788823328, "item_id": 49301458, "url": "https://news.ycombinator.com/item?id=49301458", "by": "agonux", "date": "2026-08-14", "version": null, "stance": "recommend", "quote": "golangci-lint and you have already a lot of integrated tools", "excerpt": "https://github.com/samber/cc-skills-golang https://github.com/spf13/go-skills I think , you can find a lot of skills for go. Honestly , golangci-lint and you have already a lot of integrated tools with go to improve and modernize go code.", "context": "", "use_case": "", "switched_from": "", "story": "Why Go Is an Ideal Language for AI-Assisted Software Engineering"}, {"id": 786254512, "item_id": 49140907, "url": "https://news.ycombinator.com/item?id=49140907", "by": "jerf", "date": "2026-08-01", "version": null, "stance": "recommend", "quote": "install golangci-lint, turn on errcheck [1], use a pre-commit hook", "excerpt": "No. I kind of want to leave it there. But that will probably be looked on disfavorably. I've seen at least a dozen attempts. It's not like it's hard to write it out. There's maybe a couple of variants but they're all just a handful of lines. The problem is, once you have an Option in hand, you end up trading: val, err := whatever(...) if err != nil { // handle error } // use val for val := whatever(...) if err, isErr", "context": "", "use_case": "Go error handling checks", "switched_from": "", "story": "Go 1.27 Interactive Tour"}, {"id": 760922576, "item_id": 47557661, "url": "https://news.ycombinator.com/item?id=47557661", "by": "graynk", "date": "2026-03-28", "version": null, "stance": "recommend", "quote": "You either catch and enforce it with a linter", "excerpt": "Why do you need AI agents for this? You either catch and enforce it with a linter (e.g. https://golangci-lint.run/docs/linters/configuration/#revive) (in which case you don't need AI to tell you the current state, you just add the same config to all projects) or you don't enforce it (because everyone will forget unless it's automated)", "context": "", "use_case": "Go linting", "switched_from": "", "story": "Go Naming Conventions: A Practical Guide"}, {"id": 744685969, "item_id": 46542873, "url": "https://news.ycombinator.com/item?id=46542873", "by": "jerf", "date": "2026-01-08", "version": null, "stance": "recommend", "quote": "which is even better used as a component of golangci-lint", "excerpt": "Author is still early in their exploration and has some definite mistakes in here. Probably the biggest one is around the error handling, thinking that the only way to interact with an error is through the error interface itself. That is intended as a baseline interaction, a fallback for when nothing else is appropriate, such as just slamming an error into a log. If you want to interact with specific errors, you shou", "context": "", "use_case": "", "switched_from": "", "story": "An Honest Review of Go"}]}], "caveats": [{"label": "", "summary": "", "quotes": [{"id": 784916944, "item_id": 49057309, "url": "https://news.ycombinator.com/item?id=49057309", "by": "gempir", "date": "2026-07-26", "version": null, "stance": "warn", "quote": "it's okay but it's slow even with a cache", "excerpt": "I've been using golangci-lint for years, it's okay but it's slow even with a cache, as soon as you have good amount of lints enabled your ci can suddendly take minutes. That's not the fault of golangci-lint, it's just the concept of bringing together a bunch of different linters and keeping it fast is impossible. And the configuration is a bit wild too, because every linter obviously has their own decisions on how it", "context": "", "use_case": "Go linting in CI", "switched_from": "", "story": "Ruff v0.16.0 \u2013 Significant new updates \u2013 413 default rules up from 59"}, {"id": 776461682, "item_id": 48528855, "url": "https://news.ycombinator.com/item?id=48528855", "by": "awinter-py", "date": "2026-06-14", "version": null, "stance": "warn", "quote": "golangci-lint is a painful codebase", "excerpt": "See previous kleppmann post https://martin.kleppmann.com/2025/12/08/ai-formal-verification.html, and yes, obviously anything that you can put in the typesystem or the linter, you should weigh doing so. Hopefully we get more ergonomic ways to do this? Like of the tools listed in the post, dafny + iris are the closest to being industrial I think. And amzn S3 has a history of TLA use in-house I think. But we probably ha", "context": "", "use_case": "", "switched_from": "", "story": "Formal Methods and the Future of Programming"}, {"id": 761318112, "item_id": 47582382, "url": "https://news.ycombinator.com/item?id=47582382", "by": "yunwal", "date": "2026-03-30", "version": null, "stance": "warn", "quote": "There are 30 different formatting tools that all frequently conflict with each other. It got so complicated that one project exists to manage installations of all the other ones (golangci-lint).", "excerpt": "Things that are not simple about go tooling - Comments as directives[0]. Nobody finds this intuitive. I've never met anyone that saw what directives were doing and thought to change a comment. - Comments as commands for the compiler[1] - The state of go linting[2]. There are 30 different formatting tools that all frequently conflict with each other. It got so complicated that one project exists to manage installation", "context": "", "use_case": "", "switched_from": "", "story": "Swift 6.3 Released"}]}], "who": [], "tags": [], "use_cases": ["go linting", "go linting in ci", "go error handling checks"], "compared": [{"slug": "ruff", "name": "Ruff", "co": 2, "switched_from": 0, "switched_to": 0}], "makers": [], "threads": [{"url": "https://news.ycombinator.com/item?id=49365405", "title": "Go 1.27 Is Released", "mentions": 2}, {"url": "https://news.ycombinator.com/item?id=49056112", "title": "Ruff v0.16.0 \u2013 Significant new updates \u2013 413 default rules up from 59", "mentions": 2}, {"url": "https://news.ycombinator.com/item?id=49261133", "title": "Why Go Is an Ideal Language for AI-Assisted Software Engineering", "mentions": 1}, {"url": "https://news.ycombinator.com/item?id=49140218", "title": "Go 1.27 Interactive Tour", "mentions": 1}, {"url": "https://news.ycombinator.com/item?id=48526633", "title": "Formal Methods and the Future of Programming", "mentions": 1}, {"url": "https://news.ycombinator.com/item?id=47527590", "title": "Swift 6.3 Released", "mentions": 1}], "sentiment_by_month": {"2025-11": {"recommend": 1}, "2025-12": {}, "2026-01": {"recommend": 1}, "2026-02": {"neutral": 1}, "2026-03": {"recommend": 1, "warn": 1}, "2026-04": {}, "2026-05": {}, "2026-06": {"warn": 1}, "2026-07": {"neutral": 1, "warn": 1}, "2026-08": {"recommend": 2, "warn": 1}, "2026-09": {}, "2026-10": {}}, "versions": [], "version_unnamed": 0, "family_ref": null, "runs_on": null, "lines": [], "quotes": [{"id": 789988992, "item_id": 49374312, "url": "https://news.ycombinator.com/item?id=49374312", "by": "jerf", "date": "2026-08-20", "version": null, "stance": "recommend", "quote": "it would ship with an equivalent of golangci-lint and its open-source ethos of linting from day one", "excerpt": "You, or $YOU, could add that as a linter and integrate it into golangci-lint [1]. There are many things in golangci-lint that I abhor and can't even imagine turning on, things that default to false that I can't imagine working without, and some things I think just bizarre... and everyone will have their own distinct list of such things. While one can argue about the virtues of things being in linters versus in the la", "context": "", "use_case": "Go linting", "switched_from": "", "story": "Go 1.27 Is Released"}, {"id": 789942416, "item_id": 49371401, "url": "https://news.ycombinator.com/item?id=49371401", "by": "tkw01536", "date": "2026-08-20", "version": null, "stance": "warn", "quote": "", "excerpt": "I\u2019ve been able to run golangci-lint locally just fine. However I\u2019ve not had much success running it on CI, with at least the 1.27rcs. I encountered some panic deep within staticcheck, and ended up turning off that specific linter on CI (better than not running it at all). There was a tracking issue for go1.27 support at [1]. However that is now closed, which might imply that it should be working. [1] https://github.c", "context": "", "use_case": "Go linting in CI", "switched_from": "", "story": "Go 1.27 Is Released"}, {"id": 788823328, "item_id": 49301458, "url": "https://news.ycombinator.com/item?id=49301458", "by": "agonux", "date": "2026-08-14", "version": null, "stance": "recommend", "quote": "golangci-lint and you have already a lot of integrated tools", "excerpt": "https://github.com/samber/cc-skills-golang https://github.com/spf13/go-skills I think , you can find a lot of skills for go. Honestly , golangci-lint and you have already a lot of integrated tools with go to improve and modernize go code.", "context": "", "use_case": "", "switched_from": "", "story": "Why Go Is an Ideal Language for AI-Assisted Software Engineering"}, {"id": 786254512, "item_id": 49140907, "url": "https://news.ycombinator.com/item?id=49140907", "by": "jerf", "date": "2026-08-01", "version": null, "stance": "recommend", "quote": "install golangci-lint, turn on errcheck [1], use a pre-commit hook", "excerpt": "No. I kind of want to leave it there. But that will probably be looked on disfavorably. I've seen at least a dozen attempts. It's not like it's hard to write it out. There's maybe a couple of variants but they're all just a handful of lines. The problem is, once you have an Option in hand, you end up trading: val, err := whatever(...) if err != nil { // handle error } // use val for val := whatever(...) if err, isErr", "context": "", "use_case": "Go error handling checks", "switched_from": "", "story": "Go 1.27 Interactive Tour"}, {"id": 784916944, "item_id": 49057309, "url": "https://news.ycombinator.com/item?id=49057309", "by": "gempir", "date": "2026-07-26", "version": null, "stance": "warn", "quote": "it's okay but it's slow even with a cache", "excerpt": "I've been using golangci-lint for years, it's okay but it's slow even with a cache, as soon as you have good amount of lints enabled your ci can suddendly take minutes. That's not the fault of golangci-lint, it's just the concept of bringing together a bunch of different linters and keeping it fast is impossible. And the configuration is a bit wild too, because every linter obviously has their own decisions on how it", "context": "", "use_case": "Go linting in CI", "switched_from": "", "story": "Ruff v0.16.0 \u2013 Significant new updates \u2013 413 default rules up from 59"}, {"id": 784910325, "item_id": 49056895, "url": "https://news.ycombinator.com/item?id=49056895", "by": "gopherino", "date": "2026-07-26", "version": null, "stance": "neutral", "quote": "So hopefully golangci-lint and others should eventually all unify under this framework.", "excerpt": "It does and it is even better. It is called the Go Analysis Framework (https://pkg.go.dev/golang.org/x/tools/go/analysis). It is fairly new so not well known but it is what powers go fix and go vet under the hood. And I believe the Go team is currently working on making it possible for module authors to easily describe their own custom analysis passes that would run automatically when running go fix. It is extremely ", "context": "", "use_case": "", "switched_from": "", "story": "Ruff v0.16.0 \u2013 Significant new updates \u2013 413 default rules up from 59"}, {"id": 776461682, "item_id": 48528855, "url": "https://news.ycombinator.com/item?id=48528855", "by": "awinter-py", "date": "2026-06-14", "version": null, "stance": "warn", "quote": "golangci-lint is a painful codebase", "excerpt": "See previous kleppmann post https://martin.kleppmann.com/2025/12/08/ai-formal-verification.html, and yes, obviously anything that you can put in the typesystem or the linter, you should weigh doing so. Hopefully we get more ergonomic ways to do this? Like of the tools listed in the post, dafny + iris are the closest to being industrial I think. And amzn S3 has a history of TLA use in-house I think. But we probably ha", "context": "", "use_case": "", "switched_from": "", "story": "Formal Methods and the Future of Programming"}, {"id": 761318112, "item_id": 47582382, "url": "https://news.ycombinator.com/item?id=47582382", "by": "yunwal", "date": "2026-03-30", "version": null, "stance": "warn", "quote": "There are 30 different formatting tools that all frequently conflict with each other. It got so complicated that one project exists to manage installations of all the other ones (golangci-lint).", "excerpt": "Things that are not simple about go tooling - Comments as directives[0]. Nobody finds this intuitive. I've never met anyone that saw what directives were doing and thought to change a comment. - Comments as commands for the compiler[1] - The state of go linting[2]. There are 30 different formatting tools that all frequently conflict with each other. It got so complicated that one project exists to manage installation", "context": "", "use_case": "", "switched_from": "", "story": "Swift 6.3 Released"}, {"id": 760922576, "item_id": 47557661, "url": "https://news.ycombinator.com/item?id=47557661", "by": "graynk", "date": "2026-03-28", "version": null, "stance": "recommend", "quote": "You either catch and enforce it with a linter", "excerpt": "Why do you need AI agents for this? You either catch and enforce it with a linter (e.g. https://golangci-lint.run/docs/linters/configuration/#revive) (in which case you don't need AI to tell you the current state, you just add the same config to all projects) or you don't enforce it (because everyone will forget unless it's automated)", "context": "", "use_case": "Go linting", "switched_from": "", "story": "Go Naming Conventions: A Practical Guide"}, {"id": 749698016, "item_id": 46856126, "url": "https://news.ycombinator.com/item?id=46856126", "by": "jerf", "date": "2026-02-02", "version": null, "stance": "neutral", "quote": "not always advertised as well as you like", "excerpt": "Grovel over your linter's command-line options and/or configuration file. It's not an uncommon feature but from my personal and limited experience it is also not always advertised as well as you like. For instance, golangci-lint has not just a feature to check only changed code, but several variants of it available, but I think possibly the only places that these are mentioned on its site are in the specific document", "context": "", "use_case": "Go linting", "switched_from": "", "story": "Ratchets in Software Development"}, {"id": 744685969, "item_id": 46542873, "url": "https://news.ycombinator.com/item?id=46542873", "by": "jerf", "date": "2026-01-08", "version": null, "stance": "recommend", "quote": "which is even better used as a component of golangci-lint", "excerpt": "Author is still early in their exploration and has some definite mistakes in here. Probably the biggest one is around the error handling, thinking that the only way to interact with an error is through the error interface itself. That is intended as a baseline interaction, a fallback for when nothing else is appropriate, such as just slamming an error into a log. If you want to interact with specific errors, you shou", "context": "", "use_case": "", "switched_from": "", "story": "An Honest Review of Go"}, {"id": 734937104, "item_id": 45933569, "url": "https://news.ycombinator.com/item?id=45933569", "by": "thegeekpirate", "date": "2025-11-14", "version": null, "stance": "recommend", "quote": "https://golangci-lint.run will do this for you.", "excerpt": "> exhaustive checks for sum types Linters such as https://golangci-lint.run will do this for you.", "context": "", "use_case": "Go linting", "switched_from": "", "story": "Go's Sweet 16"}]}