After reading more about async Rust and talking with some programmer friends, the consensus was to "go with Go".
I've been learning the language using only resources on go.dev and have already written a web server for juran.io without even considering a 3rd party framework or library.
Likes
To paraphrase Rob Pike, Go is about different programming paradigms more than it is about a new programming language. My feeling so far is that it's about KISS and keeping the number of layers in your codebase to a minimum.
The simple language constructs are great. Certainly the opposite of Rust.
The standard library is fantastic.
While I haven't used it in code yet the concurrency model looks A+. It's simple. It doesn't pollute like Javascript async does.
Strong opinions (via gofmt) are refreshing in a time when every project can be setup different.
Dislikes
"Rob Pike terseness" especially in variable names have tripped me up a few times when reading stdlib source. I don't need Java verbosity but using a few extra syllables would be good.
Terseness also shows up in multiple purpose functions. Eg it took me a minute to realize that Template provides access to a single template file but is also a cache of all parsed templates:
I've been learning the language using only resources on go.dev and have already written a web server for juran.io without even considering a 3rd party framework or library.
Likes
To paraphrase Rob Pike, Go is about different programming paradigms more than it is about a new programming language. My feeling so far is that it's about KISS and keeping the number of layers in your codebase to a minimum.
The simple language constructs are great. Certainly the opposite of Rust.
The standard library is fantastic.
While I haven't used it in code yet the concurrency model looks A+. It's simple. It doesn't pollute like Javascript async does.
Strong opinions (via gofmt) are refreshing in a time when every project can be setup different.
Dislikes
"Rob Pike terseness" especially in variable names have tripped me up a few times when reading stdlib source. I don't need Java verbosity but using a few extra syllables would be good.
Terseness also shows up in multiple purpose functions. Eg it took me a minute to realize that Template provides access to a single template file but is also a cache of all parsed templates:
t, err := template.ParseGlob("/*.html") // t is now the first template parsed but also contains the map of all templates. // in fact, every template contains a pointer to the map of all templates myTemplate := t.Lookup("some template name")
I still trip over slice range returning the index first, because I write code like:
# val is actual index and the real value is thrown away for val in range mySlice { fmt.Println(val) // prints 0, 1, 2 }