For those whom have experience in both Rust and Golang: how long did it take to become proficient in Rust compared to Golang and which did you learn to appreciate over time over the other, if at all?
Go is "easy" and makes you immediately productive. Like, productive on the first day. It's a great language for that reason. Compilers don't complain, no complicated generics, easy concurrency, loose interfaces, GC, etc. But this comes at a cost - it's easy to write sloppy code. Because of its flexibility, my code often suffered from concurrency bugs (don't get me started on deadlock debugging), bad abstractions, or performance issues. I felt like I was productive, but I often had to re-factor my codebases multiple times because of these issues.
Rust is the opposite. I didn't feel immediate productive, and the fight with the compiler was tough at times. But most of the time, the compiler was right and I was wrong. This typically resulted in "good" code once it compiled and I rarely had to go back and refactor my code. And of course there were no pesky concurrency bugs due to the compiler checks.
These days, I would choose Rust over go for my own projects. If I consider the time spent on debugging bugs in Go, I consider myself more productive in Rust, even if the initial code takes longer to write. However, if I was leading an engineering team, I would consider Go instead. It's much easier to pick up, and it's easier to read someone else's Go code. Reading someone else's Rust code can be hard.
A long time, probably a couple months to get productive, and a couple more to learn the foundation pretty well. And this is with a steady supply of side projects to help me solidify my learnings.
2) Which did you learn to appreciate over time over the other, if at all?
I chose Rust over Go because for my side projects (at the time) Rust was faster and had a better package manager. Since most of my side projects are command line tools, Rust fit in quite well in this domain.
A side note. I think it's more helpful to choose a language based on how well it solves your problems rather than its amount of shortcomings. If Go has the right packages and tools, go with that. If Rust does, choose that one instead. For me, the ability to quickly pick up the best language for the job is IMO more valuable than picking a language with less 'edge cases'.
Define concrete goals with learning any language and that will help you measure progress. Rust is a massive language with many features that aren't required learning in order to accomplish many types of development. Over time, you'll probably learn them out of curiosity and continued personal development. You'll also return to code that you seek to optimize.
The biggest thing I am missing right now from Go is the fast compile times, something I rarely had to think about before. In some of the small Rust projects I’ve tried out, compilation takes minutes on a clean run or after having updated dependencies. When you’re checking out a lot of different Github projects, or experimenting with different crates, it really adds up.
I’ve tried out Rust’s equivalent of channels (the `std::sync::mpsc` module - https://doc.rust-lang.org/std/sync/mpsc/) and it feels clunky by comparison to Go. Spawning threads in Rust via a `thread::spawn()` call feels archaic compared to `go func` (putting aside that threads aren’t exactly equivalent to goroutines, you might generally use them in the same way). I’d actually hope Rust could introduce first class language constructs for concurrency like Go has, at some point.
There are some other Go things like implicit interfaces I am learning to get used to without, but I am really liking Rust’s concept of ownership and having proper enum types/pattern matching is a breath of fresh air. I probably appreciate Go more now for what it is - a straightforward, performant language with very good devex.
I think you should identify which ecosystem and toolset you like working with. I'm leaning towards Golang for web development and web/system protocols. I chose to explore Rust as an intro to embedded development and audio/dsp programming - an alternative to learning C++. Rust seems great as a well-absracted, yet powerful and performant low-level programming language. I feel much more comfortable writing code with the Golang toolchain, but I feel much more confident with my end-result thanks to the strictness of the Rust compiler. I appreciate the specifics Golang conventions and opinions as well as the openness/comprehensiveness of the Rust language and community - not saying there aren't conventions and idioms, rather there are so many options and approaches to implementation within the language. YMMV, figure out what feels more natural to your process, style, and application context.