[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-golangci-lint-v2-5-0-revive-checks-en":3,"article-related-golangci-lint-v2-5-0-revive-checks-en":30,"series-tools-af69202e-8810-49fc-ba85-dfd18ae1217e":73},{"id":4,"slug":5,"title":6,"content":7,"summary":8,"source":9,"source_url":10,"author":11,"image_url":12,"cover_image":12,"category":13,"language":14,"translated_content":11,"related_article_id":15,"keywords":16,"key_takeaways":22,"views":26,"created_at":27,"published_at":28,"topic_cluster_id":29},"af69202e-8810-49fc-ba85-dfd18ae1217e","golangci-lint-v2-5-0-revive-checks-en","Golangci-lint v2.5.0 adds 8 revive checks","\u003Cp data-speakable=\"summary\">Golangci-lint v2.5.0 adds eight new revive options and two new linters.\u003C\u002Fp>\u003Cp>\u003Ca href=\"https:\u002F\u002Fgolangci-lint.run\u002Fdocs\u002Fproduct\u002Fchangelog\u002F\" target=\"_blank\" rel=\"noopener\">Golangci-lint\u003C\u002Fa> keeps moving fast, and the v2.5.0 release is a good example of why teams keep it in their CI pipeline. Released on 2025-09-21, this version adds \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fgodoc-lint\u002Fgodoc-lint\" target=\"_blank\" rel=\"noopener\">godoclint\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FMirrexOne\u002Funqueryvet\" target=\"_blank\" rel=\"noopener\">unqueryvet\u003C\u002Fa>, and a long list of new checks and options across existing linters.\u003C\u002Fp>\u003Cp>The headline change for many Go teams is \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fmgechev\u002Frevive\" target=\"_blank\" rel=\"noopener\">revive\u003C\u002Fa> 1.12.0. It brings eight new options focused on branch logic, package naming, URL schemes, and goroutine coordination. If your codebase uses revive heavily, this release is more than a version bump; it changes what the linter can actually flag.\u003C\u002Fp>\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>Item\u003C\u002Fth>\u003Cth>Change\u003C\u002Fth>\u003Cth>Notes\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd>Release\u003C\u002Ftd>\u003Ctd>v2.5.0\u003C\u002Ftd>\u003Ctd>Released on 2025-09-21\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>New linters\u003C\u002Ftd>\u003Ctd>2\u003C\u002Ftd>\u003Ctd>godoclint, unqueryvet\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>revive\u003C\u002Ftd>\u003Ctd>1.11.0 → 1.12.0\u003C\u002Ftd>\u003Ctd>8 new options\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Go support\u003C\u002Ftd>\u003Ctd>Go 1.25\u003C\u002Ftd>\u003Ctd>Listed as an enhancement\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Other linter bump\u003C\u002Ftd>\u003Ctd>gofumpt 0.8.0 → 0.9.1\u003C\u002Ftd>\u003Ctd>Clarifies naked-return formatting\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003Ch2>What changed in v2.5.0\u003C\u002Fh2>\u003Cp>The release reads like a maintenance-heavy update with a few meaningful additions. The project added two new linters, expanded support for Go 1.25, and pushed several existing tools forward with new rules or configuration knobs.\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1782605879327-gt0d.png\" alt=\"Golangci-lint v2.5.0 adds 8 revive checks\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cp>That mix matters because golangci-lint is most useful when it tracks the ecosystem instead of freezing it. A linter pack that lags behind new Go versions or ignores newer static-analysis tools quickly becomes a stale wrapper around old checks.\u003C\u002Fp>\u003Cul>\u003Cli>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fgodoc-lint\u002Fgodoc-lint\" target=\"_blank\" rel=\"noopener\">godoclint\u003C\u002Fa> joins the bundle as a new linter.\u003C\u002Fli>\u003Cli>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FMirrexOne\u002Funqueryvet\" target=\"_blank\" rel=\"noopener\">unqueryvet\u003C\u002Fa> also ships in the release.\u003C\u002Fli>\u003Cli>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fmgechev\u002Frevive\" target=\"_blank\" rel=\"noopener\">revive\u003C\u002Fa> gets eight new options in 1.12.0.\u003C\u002Fli>\u003Cli>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fcontainous\u002Fghodss-yaml\" target=\"_blank\" rel=\"noopener\">gofumpt\u003C\u002Fa> moves from 0.8.0 to 0.9.1 with a clearer rule for naked returns.\u003C\u002Fli>\u003Cli>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fsecurego\u002Fgosec\" target=\"_blank\" rel=\"noopener\">gosec\u003C\u002Fa> advances from 2.22.7 to 2.22.8.\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>Revive gets the most practical expansion\u003C\u002Fh2>\u003Cp>The most detailed change in the changelog is revive’s jump from 1.11.0 to 1.12.0. The new options target patterns that show up in real \u003Ca href=\"\u002Ftag\u002Fcode-review\">code review\u003C\u002Fa> complaints: repeated if\u002Felse branches, repeated switch branches, package-directory mismatches, unsafe URL schemes, and the use of wait groups in goroutines.\u003C\u002Fp>\u003Cp>That matters because revive is often used as the opinionated style and maintainability layer inside a larger lint stack. The more specific its checks become, the less time reviewers spend catching the same easy mistakes by hand.\u003C\u002Fp>\u003Cblockquote>\u003Cp>“Code should be written to minimize the time it would take for someone else to understand it.” — Robert C. Martin, \u003Ca href=\"https:\u002F\u002Fwww.goodreads.com\u002Fquotes\u002F44517-code-should-be-written-to-minimize-the-time-it-would\" target=\"_blank\" rel=\"noopener\">Goodreads quote\u003C\u002Fa>\u003C\u002Fp>\u003C\u002Fblockquote>\u003Cp>That quote fits this release almost too well. The new revive options are all about making intent clearer and preventing patterns that look harmless in review but create confusion later.\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cstrong>identical-ifelseif-branches\u003C\u002Fstrong> and \u003Cstrong>identical-ifelseif-conditions\u003C\u002Fstrong> catch duplicate branch logic.\u003C\u002Fli>\u003Cli>\u003Cstrong>identical-switch-branches\u003C\u002Fstrong> and \u003Cstrong>identical-switch-conditions\u003C\u002Fstrong> do the same for switch statements.\u003C\u002Fli>\u003Cli>\u003Cstrong>package-directory-mismatch\u003C\u002Fstrong> checks whether package names match folder structure.\u003C\u002Fli>\u003Cli>\u003Cstrong>unsecure-url-scheme\u003C\u002Fstrong> flags risky URL schemes.\u003C\u002Fli>\u003Cli>\u003Cstrong>use-waitgroup-go\u003C\u002Fstrong> and \u003Cstrong>useless-fallthrough\u003C\u002Fstrong> add more concurrency and control-flow checks.\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>The new linters point to two different needs\u003C\u002Fh2>\u003Cp>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fgodoc-lint\u002Fgodoc-lint\" target=\"_blank\" rel=\"noopener\">godoclint\u003C\u002Fa> is about documentation quality. \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FMirrexOne\u002Funqueryvet\" target=\"_blank\" rel=\"noopener\">unqueryvet\u003C\u002Fa> is about safer database query handling. That split is useful because it shows where golangci-lint is spending attention: one tool for \u003Ca href=\"\u002Ftag\u002Fapi\">API\u003C\u002Fa> and package docs, another for SQL usage and injection risk.\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1782605874248-ikbl.png\" alt=\"Golangci-lint v2.5.0 adds 8 revive checks\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cp>The release also adds a small but practical improvement to \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fdominikh\u002Fgo-tools\u002Ftree\u002Fmaster\u002Fstaticcheck\" target=\"_blank\" rel=\"noopener\">staticcheck\u003C\u002Fa>-adjacent workflows through broader ecosystem support. For teams that treat linting as part of code health rather than a checkbox, these additions reduce the need to wire separate tools into every repository.\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cstrong>godoclint\u003C\u002Fstrong> targets documentation problems in Go code.\u003C\u002Fli>\u003Cli>\u003Cstrong>unqueryvet\u003C\u002Fstrong> focuses on query construction and SQL-related mistakes.\u003C\u002Fli>\u003Cli>\u003Cstrong>gofumpt\u003C\u002Fstrong> changes how naked returns are handled for readability.\u003C\u002Fli>\u003Cli>\u003Cstrong>gosec\u003C\u002Fstrong> and \u003Cstrong>err113\u003C\u002Fstrong> both pick up smaller updates that tighten security and error handling checks.\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>How this compares with nearby releases\u003C\u002Fh2>\u003Cp>Compared with v2.4.0, v2.5.0 looks less like a platform announcement and more like a practical expansion. v2.4.0 added Go 1.25 support and a new website with search, while v2.5.0 adds two linters and broadens existing rule sets.\u003C\u002Fp>\u003Cp>That pattern matters for adoption. Teams usually upgrade linters when the new version gives them either better signal or less maintenance cost. Here, the value comes from both: more checks in the same tool, and more specific rules inside revive, gofumpt, and other linters.\u003C\u002Fp>\u003Cul>\u003Cli>v2.4.0: Go 1.25 support and a new website.\u003C\u002Fli>\u003Cli>v2.5.0: two new linters and eight new revive options.\u003C\u002Fli>\u003Cli>\u003Ca href=\"https:\u002F\u002Fgolangci-lint.run\u002Fdocs\u002Fproduct\u002Fchangelog\u002F\" target=\"_blank\" rel=\"noopener\">v2.6.0\u003C\u002Fa>: adds a modernize analyzer suite and more linter updates.\u003C\u002Fli>\u003Cli>\u003Ca href=\"https:\u002F\u002Fgolangci-lint.run\u002Fdocs\u002Fproduct\u002Fchangelog\u002F\" target=\"_blank\" rel=\"noopener\">v2.12.0\u003C\u002Fa>: later releases keep expanding the bundled checks even further.\u003C\u002Fli>\u003C\u002Ful>\u003Cp>If you maintain a Go codebase with revive enabled, this release is worth a config review before you merge the upgrade. New rules can surface old code smells fast, and the best time to decide whether to tune them is before they flood your CI logs. The practical question is simple: which of these eight revive checks should be warnings first, and which should fail the build on day one?\u003C\u002Fp>\u003Cp>For teams already using golangci-lint in CI, v2.5.0 is the kind of update that quietly raises code quality without demanding a migration project. For everyone else, it is a reminder that the tool has moved well beyond a thin wrapper around a few popular linters.\u003C\u002Fp>","Golangci-lint v2.5.0 adds eight new revive options, plus new linters and broader Go 1.25 support.","golangci-lint.run","https:\u002F\u002Fgolangci-lint.run\u002Fdocs\u002Fproduct\u002Fchangelog\u002F",null,"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1782605879327-gt0d.png","tools","en","c81b891c-6bd0-48e7-b9b0-eacbc93560f0",[17,18,19,20,21],"golangci-lint","revive","go linting","static analysis","Go 1.25",[23,24,25],"v2.5.0 adds godoclint and unqueryvet to golangci-lint.","revive 1.12.0 introduces eight new options for branch, package, URL, and concurrency checks.","The release also expands support for Go 1.25 and updates several existing linters.",0,"2026-06-28T00:17:31.879198+00:00","2026-06-28T00:17:31.871+00:00","a7343b93-37cc-4634-a2bc-707f6275bdb6",{"tags":31,"relatedLang":32,"relatedPosts":36},[],{"id":15,"slug":33,"title":34,"language":35},"golangci-lint-v2-5-0-revive-checks-zh","Golangci-lint v2.5.0 加入 8 項 revive 檢查","zh",[37,43,49,55,61,67],{"id":38,"slug":39,"title":40,"cover_image":41,"image_url":41,"created_at":42,"category":13},"76829ec6-953d-4ae8-8cbd-7d4ebf92ed5f","golangci-lint-faq-ci-policy-en","Golangci-lint’s FAQ turns CI noise into a policy","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1782607698288-yn0f.png","2026-06-28T00:47:54.495313+00:00",{"id":44,"slug":45,"title":46,"cover_image":47,"image_url":47,"created_at":48,"category":13},"a8344911-b020-4892-ba6c-621df2dc11f8","gorm-advanced-query-helpers-guardrails-en","GORM query helpers turn SQL into guardrails","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1782606800691-nx1d.png","2026-06-28T00:32:59.159701+00:00",{"id":50,"slug":51,"title":52,"cover_image":53,"image_url":53,"created_at":54,"category":13},"5521addb-874b-44fe-a38d-32f4299010d2","open-source-ai-projects-developers-2026-en","7 open-source AI projects developers need in 2026","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1782593283378-u4f3.png","2026-06-27T20:47:36.97629+00:00",{"id":56,"slug":57,"title":58,"cover_image":59,"image_url":59,"created_at":60,"category":13},"0a5f2eb9-7c4b-4382-b0e0-501f1bc3e70f","midjourney-review-2026-v8-worth-it-en","Midjourney Review 2026: Is V8 Still Worth It?","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1782576174182-vc3v.png","2026-06-27T16:02:30.622473+00:00",{"id":62,"slug":63,"title":64,"cover_image":65,"image_url":65,"created_at":66,"category":13},"3a9390c3-0160-4d2a-bb42-25f6437aecb4","midjourney-v81-faster-renders-pricing-video-en","Midjourney V8.1 lands with 4-5x faster renders","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1782573467328-ybtn.png","2026-06-27T15:17:23.634784+00:00",{"id":68,"slug":69,"title":70,"cover_image":71,"image_url":71,"created_at":72,"category":13},"9e1a94d8-5e53-4bca-b32d-83c73cef1639","mlops-roadmap-2026-turns-learning-into-delivery-en","MLOps Roadmap 2026 Turns Learning Into Delivery","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1782567216077-5x25.png","2026-06-27T13:33:07.454419+00:00",[74,79,84,89,94,99,104,109,114,119],{"id":75,"slug":76,"title":77,"created_at":78},"8008f1a9-7a00-4bad-88c9-3eedc9c6b4b1","surepath-ai-mcp-policy-controls-en","SurePath AI's New MCP Policy Controls Enhance AI Security","2026-03-26T01:26:52.222015+00:00",{"id":80,"slug":81,"title":82,"created_at":83},"27e39a8f-b65d-4f7b-a875-859e2b210156","mcp-standard-ai-tools-2026-en","MCP Standard in 2026: Integrating AI Tools","2026-03-26T01:27:43.127519+00:00",{"id":85,"slug":86,"title":87,"created_at":88},"165f9a19-c92d-46ba-b3f0-7125f662921d","rag-2026-transforming-enterprise-ai-en","How RAG in 2026 is Transforming Enterprise AI","2026-03-26T01:28:11.485236+00:00",{"id":90,"slug":91,"title":92,"created_at":93},"6a2a8e6e-b956-49d8-be12-cc47bdc132b2","mastering-ai-prompts-2026-guide-en","Mastering AI Prompts: A 2026 Guide for Developers","2026-03-26T01:29:07.835148+00:00",{"id":95,"slug":96,"title":97,"created_at":98},"3ab2c67e-4664-4c67-a013-687a2f605814","garry-tan-open-sources-claude-code-toolkit-en","Garry Tan Open-Sources a Claude Code Toolkit","2026-03-26T08:26:20.245934+00:00",{"id":100,"slug":101,"title":102,"created_at":103},"66a7cbf8-7e76-41d4-9bbf-eaca9761bf69","github-ai-projects-to-watch-in-2026-en","20 GitHub AI Projects to Watch in 2026","2026-03-26T08:28:09.752027+00:00",{"id":105,"slug":106,"title":107,"created_at":108},"9f332fda-eace-448a-a292-2283951eee71","practical-github-guide-learning-ml-2026-en","A Practical GitHub Guide to Learning ML in 2026","2026-03-27T01:16:50.125678+00:00",{"id":110,"slug":111,"title":112,"created_at":113},"1b1f637d-0f4d-42bd-974b-07b53829144d","aiml-2026-student-ai-ml-lab-repo-review-en","AIML-2026 Is a Bare-Bones Student Lab Repo","2026-03-27T01:21:51.661231+00:00",{"id":115,"slug":116,"title":117,"created_at":118},"6d1bf3f6-e191-4d30-b55b-8a0722fa6afe","ai-trending-github-repos-and-research-feeds-en","AI Trending Tracks Repos and Research Feeds","2026-03-27T01:31:35.709532+00:00",{"id":120,"slug":121,"title":122,"created_at":123},"010539a1-4c3a-4bd3-937a-26616422ee0d","awesome-ai-for-science-research-tools-map-en","Awesome AI for Science Is Becoming a Real Research Map","2026-03-27T01:46:50.89513+00:00"]