2 ms·
I wish Go had something like Ruff! A lot of languages are getting amazing tool but Go has a very fragmented ecosystem with a lot of tools but none of them feel
by gempir 2mo ago
I wish Go had something like Ruff! A lot of languages are getting amazing tool but Go has a very fragmented ecosystem with a lot of tools but none of them feel as high quality has the likes of Ruff, Oxc, Biome or even PHP's Mago
- brainzap 2mo ago[flagged]
- gempir 2mo agoI have actually tried. But I'm not very knowledgable in the area, so it's more LLM slop than my good ideas. And I'm not sure I have the energy and passion to maintain it long term. https://github.com/gempir/strider https://github.com/gempir/strider It's definitely possible, if Google would put like one or two smart minds on the problem full time they could easily solve this problem and make the ecosystem so much stronger. But I'm guessing they already have something like this in-house and no interest in open sourcing it.
- bargainbin 2mo agoI’m not entirely sure what you mean by a fragmented ecosystem? Go has first-party formatting and linting and the language is deliberately restricted to ensure it is written in a certain way, even when written by complete novices. Compare that to Python or TypeScript which are Wild West languages without opinionated first-party tooling, and it’s clear why Ruff/Biome feel great. You just wouldn’t get that same high with Go.
- gempir 2mo agoGo has a good start for that, but It's not enough for me. Gofmt is a great idea but it isn't strict enough for my taste. Go does not have any first party static analyzers, closest is Staticcheck which is even sponsored by Google themselves
- arccy 2mo agogo vet, plus all the ones in gopls?
- deleted 2mo ago[deleted]
- Groxx 2mo agoI don't believe you can add custom analyzers to `go vet`, which arguably rules it out. But it is extremely simple to make a custom vet-like tool, because it's a trivial binary wrapper around the analysis framework, which is first-party (though it's structurally pretty limited by design, and won't handle all linting needs): https://cs.opensource.google/go/go/+/refs/tags/go1.26.5:src/cmd/vet/main.go https://cs.opensource.google/go/go/+/refs/tags/go1.26.5:src/...
- prattmic 2mo ago-vettool allows using different analyzers built with the analysis framework: https://pkg.go.dev/cmd/go#:~:text=The%20%2Dvettool%3Dprog%20flag%20selects%20a%20different%20analysis%20tool%20with%20alternative%20or%20additional%20checks%2E%20For%20example%2C%20the%20%27shadow%27%20analyzer%20can%20be%20built%20and%20run%20using%20these%20commands%3A https://pkg.go.dev/cmd/go#:~:text=The%20%2Dvettool%3Dprog%20...
- aki237 2mo agoWhat? I feel go has one of the best language tooling out there without requiring a bully ide to do stuff. golangci-lint is quite comprehensive. What do you miss otherwise? (Honestly go's distributing itself has covered a lot of it)
- gempir 2mo agogolangci-lint is good, but you have to glue together a bunch of linters, and it adds up. You can easily get runtimes of several minutes, there are caches etc but the main problem is that golangci-lint doesn't own the lints, so it will never be as fast as something like Ruff.
- alentred 2mo agoOh wow, not so long ago the sentiment was exactly opposite. Python community was struggling with tools and everyone wished to have `gofmt` for Python. Granted, this is a linter, not a formatter, but my larger point is I am glad that Python ecosystem evolved like it did recently.
- jdrek1 2mo agoRuff is actually a formatter too
- gempir 2mo agoYeah, that's how much Astral changed python. UV and Ruff are amazing tools. Go can get there, but like I said, I think everyone is building some partial tools that solve some problems, but there is not that one player building that one great tool.
- Hamuko 2mo agoIt's not really even that recent of a change. Black's been stable for the past 4+ years.
- gopherino 2mo agoIt does and it is even better. It is called the Go Analysis Framework (https://pkg.go.dev/golang.org/x/tools/go/analysis 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 easy to define your own analysis.Analyzer struct that describes your own static analysis pass. You get access to all sorts of useful information such as the AST, types, even SSA info and you can even compose the information between analyzers. Then you can easily compile it into a binary and run it by passing that binary to go fix with a command line flag. The go toolchain itself handles all the complex caching logic so that your analyzers run fast. Since it is made by the go team itself and part of the toolchain it should slowly become the unified standard you are looking for. So hopefully golangci-lint and others should eventually all unify under this framework. You can easily give it a go by telling some AI agent to write some Go Analysis analyzers and telling them to drive them with go fix. My Go projects tend to accumulate a bunch of these to enforce all sorts of rules deterministically and automatically instead of some imprecise markdown file.
- gempir 2mo agoThat sounds amazing! I do hope golangci-lint and the likes pick it up, I'm a big fan of the strict by default approach that Ruff and other linters have taken. Gofmt is great but it's still not very strict, the amount of times my colleagues have argued about formatting in Go is still too great, stuff like consts, types, funcs, methods order, struct initialziation newlines and other details that do matter, but they should be decided one and then applied everywhere like that.
- abcdefg12 2mo agogolangci-lint is already using this framework for like 90% checks
- AbuAssar 2mo agohttps://news.ycombinator.com/item?id=49057398 https://news.ycombinator.com/item?id=49057398 Let's spread the word
- deleted 2mo ago[deleted]
- Thaxll 2mo agoGolang-ci exists for a while and everyone is using it. Not sure what you're talking about.
- gempir 2mo agoI'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 wants to be configured. Ruff can lint in seconds or even sub second.
- silverwind 2mo agoIt's like 100 times slower than ruff. They had to massive caching techniques to get it to a remotely acceptable speed.