
Tooltitude for Go v1.51.1 (VS Code, 29,574 installs, 4.74/5) adds six free-tier capabilities missing or weak in gopls: live CodeLens reference counts, per-row table-driven test debugging, code inspections including variable shadowing, 20+ postfix completions, 50+ code actions, and a Go-specific grouped references view.
gopls (the official Go language server) and handles completions, go-to-definition, and formatting well enough. What it doesn't give you: a reference count above every function declaration, a "Debug" button on each row of a table-driven test, or a warning when a local variable silently shadows an imported package. Tooltitude for Go (tooltitudeteam.tooltitude) version 1.51.1 — updated May 24 — targets those gaps. 1gopls on the free tier. Its free layer adds six categories of functionality that gopls either lacks or handles weakly: 2| Feature | What you get | gopls equivalent |
|---|---|---|
| CodeLens reference counts | Live count above every function, method, interface, and field: "15 references · 3 implementations" | None |
| Table-driven test debugger | Per-row "Debug" CodeLens in test files | None — requires manual conditional breakpoints |
| Code inspections | Variable shadowing, unused assignments, unhandled errors, unreachable code | Partial — gopls flags some errors but misses shadowing |
| Postfix completions | .if, .for_range, .print, .return, 20+ more after any expression | None |
| Code actions | 50+ quick-fixes: handle error, extract/inline variable, apply De Morgan's law, generate getter/setter | Some overlap, fewer options |
| Go references view | References grouped by package → containing function, not just flat file list | Flat list only |

i == 3 or comment out every test case except the one you want. With Tooltitude, each row in the test table gets a "Debug" CodeLens. Click it and the debugger starts at exactly that case, skipping all others.func TestAdd(t *testing.T) {
cases := []struct {
a, b, want int
}{
{1, 2, 3}, // ← "Debug" appears here
{0, 0, 0}, // ← "Debug" appears here
{-1, 1, 0}, // ← "Debug" appears here
}
for _, c := range cases {
got := Add(c.a, c.b)
if got != c.want {
t.Errorf("Add(%d, %d) = %d; want %d", c.a, c.b, got, c.want)
}
}
}err.if // expands to: if err != nil { }
items.for_range // expands to: for i, v := range items { }
result.return // expands to: return result
val.var // expands to: v := val
. after an expression triggers structural expansions. 1io.ReadAll(r) — and trigger the quick-fix menu. You get three concrete options: wrap the error with context, panic, or return the raw error. No boilerplate to type from memory.data, err := io.ReadAll(r)
// Tooltitude quick-fix options:
// → Handle error (return err)
// → Handle error (panic)
// → Handle error (wrapped: return fmt.Errorf("...": %w, err))
tooltitudeteam.tooltitudego.mod/go.sum on open (GitHub issue #74, filed April 2026): Tooltitude v1.49.0+ automatically syncs the project on open and rewrites these files, which prevents branch switching while the extension is active. No setting to disable this behavior yet. 3fmt. when fmt isn't yet imported yields no suggestions. gopls handles this correctly. 4gopls entirely is marked experimental and doesn't cover all gopls capabilities. 5vscode.env.machineId. You can disable it via VS Code's telemetry.telemetryLevel setting. 9marketplace.visualstudio.com
tooltitude.com
github.com
tooltitude.com
tooltitude.com
tooltitude.com
This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.