{"slug": "gopls", "name": "gopls", "category": "other", "category_name": "Other software", "description": "", "recommenders": 6, "commenters": 11, "warners": 2, "score": 4.282, "rising": -1.96, "first": "2025-11-15", "latest": "2026-08-20", "why": "gopls is a great LSP, though, and it warns you about this immediately.", "why_is_quote": true, "has_verdict": false, "sentiment": {"recommend": 7, "neutral": 3, "compare": 0, "warn": 2}, "spark": [1, 0, 0, 2, 0, 1, 0, 0, 3, 0, 0, 0], "listed": true, "loved": [], "caveat": "", "short_quote": "gopls is a great LSP, though, and it warns you about this immediately.", "kind": "", "icon": true, "domain": "go.dev", "github_repo": null, "official_url": "https://go.dev/gopls/", "pricing": "", "aliases": ["gopls"], "verdict": null, "praise": [{"label": "", "summary": "", "quotes": [{"id": 785479008, "item_id": 49092438, "url": "https://news.ycombinator.com/item?id=49092438", "by": "verdverm", "date": "2026-07-28", "version": null, "stance": "recommend", "quote": "I give my agent access to go pls and find it overall beneficial", "excerpt": "not sure if Go pls supports moving between files, but it does have some sophisticated edit features https://go.dev/gopls/features/transformation it does look to have a method for moving a function to a new file I give my agent access to go pls and find it overall beneficial, based on vibes eval. Its way easier to ask LSP everywhere a function or field is used versus grep, saves a lot of tokens", "context": "", "use_case": "Code navigation for AI agent", "switched_from": "", "story": "Boris Cherny says \"delete your Claude.md every 6 months\""}, {"id": 785057904, "item_id": 49066119, "url": "https://news.ycombinator.com/item?id=49066119", "by": "bayindirh", "date": "2026-07-27", "version": null, "stance": "recommend", "quote": "gopls is a great LSP, though, and it warns you about this immediately.", "excerpt": "You don't need a linter. Practically Go code will not compile without declaring and using the \"err\" returning from a function call. I have written a fresh example at https://files.bayindirh.io/misc/error_example.go. Give it a Go. ;) OTOH, gopls is a great LSP, though, and it warns you about this immediately.", "context": "", "use_case": "", "switched_from": "", "story": "Go Analysis Framework: modular static analysis by go team"}, {"id": 784758512, "item_id": 49047407, "url": "https://news.ycombinator.com/item?id=49047407", "by": "literallyroy", "date": "2026-07-25", "version": null, "stance": "recommend", "quote": "You can also get escape analysis visualizations in vscode via gopls", "excerpt": "You can also get escape analysis visualizations in vscode via gopls: https://topofmind.dev/blog/2023/07/15/analyzing-go-heap-escapes/#configuring-vscode-for-gc-heap-escape-highlighting", "context": "", "use_case": "Go language server", "switched_from": "", "story": "Escape Analysis in Go: Stack vs. Heap Allocations Explained"}, {"id": 762369396, "item_id": 47648087, "url": "https://news.ycombinator.com/item?id=47648087", "by": "cookiengineer", "date": "2026-04-05", "version": null, "stance": "recommend", "quote": "go build, go test, go fmt, gopls etc) which saves a lot of prompts and tokens", "excerpt": "This is essentially the hack that Claude Code did with their dedicated sub-agent that summarizes a list of previous messages and maintains different types of memory (temporary, persistent, cross-agent). They also built tools so that agents can talk to each other and use that summary to propagate knowledge to other agents if needed. Setting aside that their codebase is absolute slopcrap, I think something like this mi", "context": "", "use_case": "Go tooling", "switched_from": "", "story": "LLM Wiki"}, {"id": 752883680, "item_id": 47055230, "url": "https://news.ycombinator.com/item?id=47055230", "by": "Arifcodes", "date": "2026-02-17", "version": null, "stance": "recommend", "quote": "go fix, go vet, gopls - the stdlib toolchain does a lot that other ecosystems need third-party plugins for.", "excerpt": "Go's tooling story in general is underrated. go fix, go vet, gopls - the stdlib toolchain does a lot that other ecosystems need third-party plugins for. On the subject of Go in production: I wrote up some lessons from running Go LLM pipelines at scale (fintech + gov workloads) if anyone is working on similar things. Covers caching strategies, error handling patterns specific to LLM failures, and why pgvector beats a ", "context": "", "use_case": "", "switched_from": "", "story": "Using go fix to modernize Go code"}]}], "caveats": [{"label": "", "summary": "", "quotes": [{"id": 773527696, "item_id": 48345481, "url": "https://news.ycombinator.com/item?id=48345481", "by": "yarn_", "date": "2026-05-31", "version": null, "stance": "warn", "quote": "I honestly laughed out loud the first time i used gopls.", "excerpt": "Well its also just idiotic in terms of how some huge number of people write code. I know I'll need so-and-so import, so i write it at the top of the file before i even start, I press ctrl-s and it dissapears... I honestly laughed out loud the first time i used gopls.", "context": "", "use_case": "Go language server", "switched_from": "", "story": "Zig: Build System Reworked"}]}], "who": [{"by": "derstruct", "context": "author of a Go HTML template extension", "url": "https://news.ycombinator.com/item?id=47717541", "date": "2026-04-10"}], "tags": [], "use_cases": ["go language server", "code navigation for ai agent", "go tooling"], "compared": [], "makers": [{"id": 756103920, "item_id": 47256495, "url": "https://news.ycombinator.com/item?id=47256495", "by": "adonovan", "date": "2026-03-04", "version": null, "stance": "neutral", "quote": "since we enabled it over a year ago in gopls, our LSP server", "excerpt": "Very interesting. The Go toolchain has an (off by default) telemetry system. For Go 1.23, I added the runtime.SetCrashOutput function and used it to gather field reports containing stack traces for crashes in any running goroutine. Since we enabled it over a year ago in gopls, our LSP server, we have discovered hundreds of bugs. Even with only about 1 in 1000 users enabling telemetry, it has been an invaluable source", "context": "", "use_case": "", "switched_from": "", "story": "10% of Firefox crashes are caused by bitflips"}], "threads": [{"url": "https://news.ycombinator.com/item?id=47049479", "title": "Using go fix to modernize Go code", "mentions": 2}, {"url": "https://news.ycombinator.com/item?id=49365405", "title": "Go 1.27 Is Released", "mentions": 1}, {"url": "https://news.ycombinator.com/item?id=49077040", "title": "Boris Cherny says \"delete your Claude.md every 6 months\"", "mentions": 1}, {"url": "https://news.ycombinator.com/item?id=49057398", "title": "Go Analysis Framework: modular static analysis by go team", "mentions": 1}, {"url": "https://news.ycombinator.com/item?id=48989065", "title": "Escape Analysis in Go: Stack vs. Heap Allocations Explained", "mentions": 1}, {"url": "https://news.ycombinator.com/item?id=48334048", "title": "Zig: Build System Reworked", "mentions": 1}], "sentiment_by_month": {"2025-11": {"recommend": 1}, "2025-12": {}, "2026-01": {}, "2026-02": {"recommend": 2}, "2026-03": {"neutral": 1}, "2026-04": {"recommend": 1, "neutral": 1}, "2026-05": {"neutral": 1, "warn": 1}, "2026-06": {}, "2026-07": {"recommend": 3}, "2026-08": {"warn": 1}, "2026-09": {}, "2026-10": {}}, "versions": [], "version_unnamed": 0, "family_ref": null, "runs_on": null, "lines": [], "quotes": [{"id": 789942417, "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 language server", "switched_from": "", "story": "Go 1.27 Is Released"}, {"id": 785479008, "item_id": 49092438, "url": "https://news.ycombinator.com/item?id=49092438", "by": "verdverm", "date": "2026-07-28", "version": null, "stance": "recommend", "quote": "I give my agent access to go pls and find it overall beneficial", "excerpt": "not sure if Go pls supports moving between files, but it does have some sophisticated edit features https://go.dev/gopls/features/transformation it does look to have a method for moving a function to a new file I give my agent access to go pls and find it overall beneficial, based on vibes eval. Its way easier to ask LSP everywhere a function or field is used versus grep, saves a lot of tokens", "context": "", "use_case": "Code navigation for AI agent", "switched_from": "", "story": "Boris Cherny says \"delete your Claude.md every 6 months\""}, {"id": 785057904, "item_id": 49066119, "url": "https://news.ycombinator.com/item?id=49066119", "by": "bayindirh", "date": "2026-07-27", "version": null, "stance": "recommend", "quote": "gopls is a great LSP, though, and it warns you about this immediately.", "excerpt": "You don't need a linter. Practically Go code will not compile without declaring and using the \"err\" returning from a function call. I have written a fresh example at https://files.bayindirh.io/misc/error_example.go. Give it a Go. ;) OTOH, gopls is a great LSP, though, and it warns you about this immediately.", "context": "", "use_case": "", "switched_from": "", "story": "Go Analysis Framework: modular static analysis by go team"}, {"id": 784758512, "item_id": 49047407, "url": "https://news.ycombinator.com/item?id=49047407", "by": "literallyroy", "date": "2026-07-25", "version": null, "stance": "recommend", "quote": "You can also get escape analysis visualizations in vscode via gopls", "excerpt": "You can also get escape analysis visualizations in vscode via gopls: https://topofmind.dev/blog/2023/07/15/analyzing-go-heap-escapes/#configuring-vscode-for-gc-heap-escape-highlighting", "context": "", "use_case": "Go language server", "switched_from": "", "story": "Escape Analysis in Go: Stack vs. Heap Allocations Explained"}, {"id": 773527696, "item_id": 48345481, "url": "https://news.ycombinator.com/item?id=48345481", "by": "yarn_", "date": "2026-05-31", "version": null, "stance": "warn", "quote": "I honestly laughed out loud the first time i used gopls.", "excerpt": "Well its also just idiotic in terms of how some huge number of people write code. I know I'll need so-and-so import, so i write it at the top of the file before i even start, I press ctrl-s and it dissapears... I honestly laughed out loud the first time i used gopls.", "context": "", "use_case": "Go language server", "switched_from": "", "story": "Zig: Build System Reworked"}, {"id": 772231571, "item_id": 48264473, "url": "https://news.ycombinator.com/item?id=48264473", "by": "denysvitali", "date": "2026-05-25", "version": null, "stance": "neutral", "quote": "A comparison between the performance of RLS / rust-analyzer (painfully slow) and gopls", "excerpt": "The article seems to be just a way to say \"Rust is better\" - and it fails to do so by spreading misinformation such as the channels part (https://corrode.dev/learn/migration-guides/go-to-rust/#channels) or making a fair comparison of pprof vs Rust's flamegraph. It also skips entirely over debugging (delve vs gdb), IDE support, ecosystem (why the hell does Rust have N async runtimes?!), statically linking and so on. A", "context": "", "use_case": "", "switched_from": "", "story": "Migrating from Go to Rust"}, {"id": 763480658, "item_id": 47717541, "url": "https://news.ycombinator.com/item?id=47717541", "by": "derstruct", "date": "2026-04-10", "version": null, "stance": "neutral", "quote": "I don't have to care a lot about gopls changes, because I rely on LSP protocol itself", "excerpt": "Actually with tree-sitter it's much less moving parts inside parser-generator core (5-10x LOC less then templ, but it's difficult to compare because structure differences). My theory that I don't have to care a lot about gopls changes, because I rely on LSP protocol itself when doing conversion. I basically scan exchange JSONs for locations (sometimes recursively) that are related to `.gox` or generated `.x.go` and p", "context": "author of a Go HTML template extension", "use_case": "Go language server", "switched_from": "", "story": "Show HN: Go language extension with HTML templates"}, {"id": 762369396, "item_id": 47648087, "url": "https://news.ycombinator.com/item?id=47648087", "by": "cookiengineer", "date": "2026-04-05", "version": null, "stance": "recommend", "quote": "go build, go test, go fmt, gopls etc) which saves a lot of prompts and tokens", "excerpt": "This is essentially the hack that Claude Code did with their dedicated sub-agent that summarizes a list of previous messages and maintains different types of memory (temporary, persistent, cross-agent). They also built tools so that agents can talk to each other and use that summary to propagate knowledge to other agents if needed. Setting aside that their codebase is absolute slopcrap, I think something like this mi", "context": "", "use_case": "Go tooling", "switched_from": "", "story": "LLM Wiki"}, {"id": 758278417, "item_id": 47392401, "url": "https://news.ycombinator.com/item?id=47392401", "by": "erdaniels", "date": "2026-03-15", "version": null, "stance": "neutral", "quote": "For go, I used this on my lsp settings and it worked great.", "excerpt": "Good question. To quickly answer, no you don't need it installed locally but you will benefit from having the source available. Just so we have a common reference, look at https://github.com/edaniels/graft/blob/main/pkg/local_client_commands_lsp.go#L27. The main idea is that we are always matching the local current working directory to the corresponding synchronization directory. Using that idea, we serve an LSP loca", "context": "", "use_case": "Go language server", "switched_from": "", "story": "Show HN: Graft \u2013 Your local environment, everywhere"}, {"id": 752886224, "item_id": 47055389, "url": "https://news.ycombinator.com/item?id=47055389", "by": "verdverm", "date": "2026-02-17", "version": null, "stance": "recommend", "quote": "", "excerpt": "I believe go tooling is one of the top loved features among gophers, in particular gofmt. The best part is that all those command line utilities are also available for import. I've used them to create a license checker by walking the dep tree in code. There are also a ton of gems in the `./internal` directories, Roger Peppe has extracted them for reuse here: https://github.com/rogpeppe/go-internal", "context": "", "use_case": "", "switched_from": "", "story": "Using go fix to modernize Go code"}, {"id": 752883680, "item_id": 47055230, "url": "https://news.ycombinator.com/item?id=47055230", "by": "Arifcodes", "date": "2026-02-17", "version": null, "stance": "recommend", "quote": "go fix, go vet, gopls - the stdlib toolchain does a lot that other ecosystems need third-party plugins for.", "excerpt": "Go's tooling story in general is underrated. go fix, go vet, gopls - the stdlib toolchain does a lot that other ecosystems need third-party plugins for. On the subject of Go in production: I wrote up some lessons from running Go LLM pipelines at scale (fintech + gov workloads) if anyone is working on similar things. Covers caching strategies, error handling patterns specific to LLM failures, and why pgvector beats a ", "context": "", "use_case": "", "switched_from": "", "story": "Using go fix to modernize Go code"}, {"id": 735016480, "item_id": 45938530, "url": "https://news.ycombinator.com/item?id=45938530", "by": "tmoertel", "date": "2025-11-15", "version": null, "stance": "recommend", "quote": "but now Go users get a limited form of opt-in LSC support whenever modernizers make a suggestion.", "excerpt": "The introduction of automatic code modernizers to keep legacy code up to date with modern Go idioms is interesting: > With gopls v0.18.0, we began exploring automatic code modernizers. As Go evolves, every release brings new capabilities and new idioms; new and better ways to do things that Go programmers have been finding other ways to do. Go stands by its compatibility promise\u2014the old way will continue to work in p", "context": "", "use_case": "", "switched_from": "", "story": "Go's Sweet 16"}]}