I wrote this comment on lobste.rs yesterday, and it encapsulated many of the things that are important to me in a programming language:
It's things like how enjoyable is writing, building, and hacking with a language, that I care more for, than themes like scalability, enterprise use, or performance that the original post describes.
go doc | grepis a fucking experience. Some time ago I was editing a Go program that needed to access the file system in a general manner. I know that package os can provide an
fs.FSview for the directory name I have at hand, but I don't remember the name of the function in package os that does this. So I switch to a terminal and issue:% go doc os | grep FS func DirFS(dir string) fs.FS %
Then I use
os.DirFSin the program.
The Go toolchain is closer to feeling like a Unix thing. Each build error from the
gocommand produces exactly one line of output. None of the
gotool commands write colors in their output. But I'm glad that
cargo --color neverexists, and I alias
cargothis way. :)
And on the hackability factor, Go programs tend to write themselves with just the standard library alone. For example, when I wrote a small static website generator binary some years ago, the program naturally hacked itself with only standard library imports and a single external markdown package. I wonder if it would have been as fun hacking it with Rust - vetting external packages and what not.
First a note on the performance aspect: the differences in execution speeds and memory overhead between languages such as Go and Rust do not matter to me in typical use. However, the differences between, say, Go and Python, matters nearly always.
To supplement the earlier point on the
go command feeling more like Unix,
look at how the two commands handle successful builds. Here is
building a main package successfully:
% cargo build Compiling rustexample v0.1.0 (/Users/ns/src/examples/rustexample) Finished dev [unoptimized + debuginfo] target(s) in 0.81s(bin) %
% go build %
go command follows the "no news is good news" and the "avoid
unnecessary output" Unix philosophies here,
Some may argue that I should have compared the
go command against
cargo, but my overall point stands as far as default Rust tooling