Remix.run Logo
gempir an hour 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

alentred an hour ago | parent | next [-]

Oh 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.

gempir 41 minutes ago | parent | next [-]

Yeah, 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.

jdrek1 an hour ago | parent | prev [-]

Ruff is actually a formatter too

gopherino 43 minutes ago | parent | prev | next [-]

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 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 35 minutes ago | parent [-]

That 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.

bargainbin an hour ago | parent | prev | next [-]

I’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 43 minutes ago | parent [-]

Go 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 5 minutes ago | parent [-]

go vet, plus all the ones in gopls?

34 minutes ago | parent | prev | next [-]
[deleted]
aki237 an hour ago | parent | prev | next [-]

What? 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 44 minutes ago | parent [-]

golangci-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.

brainzap an hour ago | parent | prev [-]

feel free to build it

gempir an hour ago | parent [-]

I 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

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.