…after having written this blogging engine in it.
Go tells you to make a
$GOPATH directory with a predefined structure -
bin directory, where it sticks your compiled output; a
pkg directory for
Go libraries, and a
src directory for your source. All your Go projects go
in there. The fewer decisions I have to make about trivial organizational
stuff, the happier a developer I am.
On the other hand, maybe it’s a bit rigid? I don’t know how much one can stray from this structure if they need to, nor can I especially think of any reasons why one might want to. But this sort of thing raises red flags for me - if everything is written to assume a particular structure, and I - for whatever reason - need to stray from that structure, I imagine it’ll often be a pain to get things to accomodate me.
And on the other other hand, it seems a bit half-hearted. If the Go folks are
going to define their own own
hier(7), where do, say, templates for my
blog go? Config files? These things I still do need to think about, and
…and seriously, asking me to name my local project directory after the Github URLs it’s hosted at is just gross.
…and worse, there’s no
min() function for integers (!) and no ternary
operator, so to safely slice the last few elements of a range you need to
either write your own
min() function or do a big, five-line
The approach to error handling in this language is kind of a mess - it drowns
out the interesting parts of the algorithm with tons and tons of boilerplate.
Either) monad for ways to do this right.
Also: why does
template.Must() exist? That seems like it should be a generic
thing - fail hard on error. Why is it tied to my HTML templates? Oh, right,
There’s that thing about the
template.Must(). There’s the thing about no
min(). There’s sorting, which is just insane - for every kind of
array I need to define my own length and swap functions! And so on, and so
on. The lack of polymetric polymorphism seems to breed warts everywhere.
The tutorials and intro material are good, but the library references and stuff
need a lot of work. There’s not enough cross-referencing:
html/template, for instance,
basically tells you to go read the
text/template doc but doesn’t
actually link to it. Minor inconveniences add up. It’s rarely clear how to do
things. For instance, how do I use a
MaxBytesReader to keep
people from uploading massive POST requests? Nowhere is it clear that I need
to inject it into my
And how nice would it be if I could get a list of all types that implement an interface? One can only dream.
The compiler is super fast.
go fmt is totally a good idea.
go get makes
everything painless. I just type
go build instead of making a Makefile?
Using autotools? Setting up a cabal file? No need for a virtualenv or
whatever? All so nice.
Honestly, this is a superfast way to throw together a simple/quick webapp, and in terms of speed of development/performance/reliability (some static typing is probably better than none) I don’t think there’s anything better out there right now. Unfortunately.
Right now I’m working on a startup with a D backend, and compared to that it’s hard to say whether Go is better/smarter/wiser. Go knows how to keep it simple where D is a fucking mess, and there’s wisdom in that. But D also is smart enough to include a lot of more powerful, more complicated features that Go is scared of but sorely needs. Similar things apply to Go vs, say, Scala.
I’d like to get your thoughts on Rust.
I’ve been dabbling in D and Go since their release, but recently discovered Rust and I really like what I’ve seen. It’s still in the pre–1.0 stage but seems pretty stable.Posted by F.G. Barletta at 2013-11-28 13:56:50 +0000 UTC
Rust’s definitely exciting - everyone behind it seems to have their heads screwed on tight and the ideas behind it are super cool. What I’ve perceived as instability has kept me from getting too close, unfortunately. If that’s settling down, and once a suitable project comes to mind, I’d be very excited to check it out.Posted by Adam at 2013-11-28 15:36:44 +0000 UTC