Ask HN: Should I learn Rust or Go?

78 points by LecroJS ↗ HN
I am a full stack TypeScript dev looking to broaden my skill set by learning a new language. I’ve been weighing Rust vs Go for a long time but can’t really decide which would be a better use of my time. I often hear that people who try one of these languages after coming from something like TypeScript feel that they really level up their abilities/understanding.

I’d like to learn whichever language will make me a “better” coder in the long term. My understanding is that Rust would be the way to go here. However, I see that the Rust learning curve is significantly higher than Go’s, and that something like setting up a server in rust will take much longer than Go. It sounds like Go is better for “getting things done” but I’m wondering if I’m leaving growth/understanding on the table by going from one garbage collected language to another.

I am interested in hearing anyone’s thoughts on this matter. Especially if you have experience going from js/ts to one of these.

Thanks and happy 4th

126 comments

[ 2.7 ms ] story [ 197 ms ] thread
Reading the Go spec will only take an hour or two if you don't get distracted. If wasting time is your concern, it's such a small amount that you've probably recently wasted more time on a number of trivial things. Reading the Rust Book takes a bit longer, but it's still just a handful of hours.

https://go.dev/ref/spec https://doc.rust-lang.org/book/

Thanks for sharing! That’s good to know. I’ll likely knock out the go spec in that case. Lmk if you have any opinions either way
I agree that Go is a much smaller language and it can be learned more quickly. But I'm not sure if reading the spec is the right approach here. Shouldn't OP rather learn from a tutorial? The spec will explain the "how" part of the language but probably not the "why" part.

https://go.dev/learn/

The spec is very easy to read, and followed with some code examples can have you up to speed very quickly. Better to just spend the time up-front when it's cheap and then get the practice actually using the knowledge.
I'm not terribly familiar with Go, but surely the comparison here must be with Rusts Reference[0]? It is a bit shorter than the Rust Book (a simple print-to-pdf says 435 pages vs. 664 pages, and 104 pages for the Go spec).

0: https://doc.rust-lang.org/reference

I think the Go reference was designed with learning users in mind, whereas the Rust one isn't. That's where the book comes in; it's a more structured way to learn the language than just reading the reference. The reference can be supplementary, thought.
> Reading the Rust Book takes a bit longer, but it's still just a handful of hours.

Speaking as someone who is really enjoying learning Rust, time taken to read the book isn't a good metric for understanding the language.

The book is just a first step. The really important thing is "how much work do I have to do to get a decent level of foundational knowledge about the language", which is relatively little for either Go or Rust (or most other languages).
> The really important thing is "how much work do I have to do to get a decent level of foundational knowledge about the language", which is relatively little for either Go or Rust (or most other languages).

I might have agreed with this before I tried using Rust's strings, borrow checker and lifetimes in anger. I had some real speed bumps with these even given my prior knowledge of C#, Common Lisp and C.

What a missed opportunity to title it "Should I Rust Or Should I Go?".
Touché. And to top off your comment, my DnD party is about to engage xanathar in his lair this week which doesn’t bode well..
You should Go first and then Rust.
IMO it's short term enablement versus long term.

You will feel productive early on in Go, but it plateaus. Rust has a lot more CS concepts and I think will be the more fruitful learning experience.

Also, Rust can lead you to WASM, which might work well with your web background.

Go has also wasm output.
Go can also compile to WASM.
AFAIK since Go is garbage-collected, the WASM it generates probably needs to include a runtime, right? While in Rust since the ownership is verified at compile-time there is no need for GC.

Please correct me if I am wrong.

EDIT: s/runtime/compile-time

Can you say a little about what it means that since Rust has provable ownership at runtime, there is no need for GC? I’m familiar with Rust ownership on the surface, but lack the knowledge to see how it eliminates the need for GC. Is it just Rust’s way of guaranteeing that a program is memory safe, or is there more to it?
(A bit simplified)My understanding is that reference counting is one of the easiest way to deal with memory assignments and it needs GC.

If the ownership rules determine at compile time that your memory assignments are fine (no double free, etc.), you can avoid using reference counting (and the associated GC).

Garbage collection deals with removing allocated objects that are no longer used. Non-managed languages without a garbage-collected runtime will have to issue the corresponding “free” command for each heap-allocated memory at the necessary place. This is a hard thing to do, because freeing it before the time can result in use-after-frees that are huge vulnerabilities, and not freeing it is a memory leak.

Reference counting is a form of GC, but in itself it is not sufficient (it will leak circular references as those will always reference each other). Due to its simplicity, in a sufficiently expressive language one can create this abstraction (see shared_ptr in c++, RC, ARC in Rust) and with the necessary caveats of not using circular structures with it, you get an ergonomic semi-GC without runtime support.

Compile time/runtime issue is slightly different - in case of many allocations one can know where you will have to free it even at compile time. C++ has a concept called RAII, which is basically “put a free at the end of the scope”. This works surprisingly well for most use cases and Rust sort of mandates this semantics by the compiler in the general case.

But an object’s lifetime can’t be known in advance (think of a User object for a logged in user. Is it still needed or had it expired?) in the general case, that’s why runtime GC is needed like refcounting or tracing GC in managed languages.

These give me some good context to go off of. Are there any resources you’d recommend on an intro to garbage collection for devs without the low level cs background? I’ll read a textbook if I have to, I just don’t know where to start with that sort of thing in terms of biting off comprehend-able amounts of info
Unfortunately, I am not aware of too much intro-level texts on the topic (I would be happy to get some from other commenters). One well-regarded book is Crafting Interpreters, though it covers a wider topic. Didn’t check this section, but perhaps its GC chapter is a good introduction: https://craftinginterpreters.com/garbage-collection.html
This feels like something I needed to hear. Everything I do in life I try to maximize for long term gains, so this tells me that Rust is very likely for me even if it means I’ll make less flashy stuff at first. Also I am definitely interested in wasm and have been hearing about it for a long while but still admittedly can’t put my finger on what it’d really do for me. I generally find my front end performance to not be limited by js thanks to Cloudflare/web workers, but then again I haven’t done anything I’d consider truly heavyweight just yet. I’d be curious if you knew of any interesting rust/wasm use cases, or if you have any thoughts on where that space is headed and why it’d be good to invest in learning it. Thanks for the insightful reply :)
WASM is still fairly niche, some immediate/near term use cases might be: advanced animation (beyond CSS), 3D/VR, low-latency / low level work e.g. webUSB. MAYBE some very forward looking web-apps/hybrid apps.

There's no disputing that v8 has come a long way, so likely it's not going to be that much of a perf gain, more interesting to me is bringing more advanced languages (such as Rust) into play, great and all as TypeScript is.

Learn elixir. The way you program elixir will push you towards better coding. There's a good chance you'll get better at testing, better at writing documentation. If you stick around long enough, you will learn about distributed systems (and their failure and recovery modes) and failure domain management -- this stuff is built into the stdlib
This is the first I’ve heard a recommendation to learn elixir. I’m definitely interested based on your description + a quick google. Is there anything that comes to mind in terms of what it does different from Go/Rust that makes you recommend it? My understanding was that I’d get these types of benefits from those two languages
Painting with a broad brush... Elixir is like the new ruby where Go is like the new C and Rust is like the new C++.

Elixir shines at concurrency so it will feel more like nodejs and similarly runs on a VM like Node or Java.

Elixir, like Rust, will help with learning functional programming paradigms more than Go.

I disagree here, Elixir looks similar to Ruby from a syntax perspective. But as soon as you dig into OTP it is a completely new world.

It's true that as a beginner you can simply do web development with Phoenix and that feels similar to Rails (Or Django / Laravel / Spring / whatever web framework ). But OTP requires a different way of approaching problems.

I think your comparisons are at the superficial "what does syntax look like" level. If you're thinking culturally, roles, what they're expected to be used for, what hires look like:

Elixir is the new Erlang. Ruby is dead (I used to <3 ruby). Go is the new python, zig is the new c, and rust is the new c++.

I don't think Go or Rust provides anything similar to what you have in Erlang/Elixir. I've done a lot of Ruby and then while learning Haskell and Elm has been a paradigm change with their type systems, Elixir/Erlang felt like a much bigger step in terms of a different required way of approaching problems.

It's not that it's functional (that's completely secondary in Erlang) but its fault tolerance primitives (processes, pids, mailboxes, monitors and links) and the OTP abstractions (GenServers, Supervisors, etc).

You learn to think in terms of distributed systems and think about fault tolerance in a way you cannot in other languages as they don't provide the primitives. It's quite a big leap and it takes time to sink in.

I was going to say Elixir, thanks for mentioning it.

I'll also add that Haskell, Clojure, and other functional languages will help you think in an entirely new way to program. Python or Ruby are also less mind-expanding, but was a nice change of pace for me at least from my C# day job.

Learning window functions and more advanced bits of SQL that an ORM doesn't give you for free can also be a fun time, along with getting deeper into what indexes can really do.

Rust will be in the kernel shortly so it'll have longevity with that. Not that I'm saying GO won't but kernel inclusion suggest permanent support.
Why no start with C? Then perhaps check C++ and Rust?

If you want to understand internals of programming languages then Go isn’t a great choice because it abstracts away so much stuff.

If you really want to understand how programming languages work internally, you should look at assembly language or possibly at the bytecode interpreters of some scripting languages.

C is still fairly high-level.

The definition of "low level" keeps changing over time. :p

At this rate, Python will be called "low level" 50 years from now.

But to the OP: Rust is just "C for the 21st century" (despite people often calling Go that). The UX is stellar -- `cargo run` can't be beat, integrated unit testing, safety concepts learned in the last few decades are applied by default, and the docs are great[0]. I don't think there's any reason to learn C first, especially if you're coming from a "high level" background like TypeScript, other than experiencing culture shock and legacy braindeath horror.

0: https://doc.rust-lang.org/stable/book/title-page.html

Yeaaaa hearing c called high level makes me wonder what word would even describe the js/ts/Python I’m familiar with…
The advantage of rust is that it protects you from common errors in c. if i had to choose between c and rust as someone who likes go, i always would choose rust.
Well, I'd much rather maintain an application written in Rust or Go, than written in C.

But for gaining understanding, I think because C is so 'raw', I think that makes it useful for developing further understanding as a programmer.

I think there has to be an good reason for starting an project in c, like an special platform that isn't implemented in rust. If you need to fiddle with unsafe memory you can still use unsafe in rust.
Without any prior knowledge of C you wouldn't really understand what problems Rust solves for you. Especially when never having worked with any lang without automatic garbage collection.

A quick dive into C is a good idea for learning. It is hugely influential and basically the Latin of programming languages so any knowledge pays huge dividends down the road even if you never use it directly.

Whether you should use C was not the question. There are valid uses though even for new projects and if just for the few exotic targets that Rust doesn't yet compile to.

I think you have the right idea already, so it just depends on what you want. I believe that learning Rust has made me a better programmer because I am now explicitly thinking about ownership rules and references no matter what language I'm using. Types and memory allocation are also more explicit in Rust than in Go, adding to learning aspect. I don't think learning Go has made me a better programmer. It was just another pretty standard language. But I already knew a range of other compiled languages previously and Go wasn't sufficiently different.

Like you said, for "getting things done" that is not low-level, systems, or game programming, Go is the more reasonable choice. It's more straightforward, faster to iterate in, usually more concise, has easy concurrency primitives, and is more widely adopted in the industry.

TLDR; I'd go for Rust if you want to optimize for learning and Go otherwise.

I write JS 99.9% of the time.

I would definitely pick Rust as it is more different than JS.

Yes, there is a higher learning curve. But it will broaden your perception on programming languages.

As an added bonus, rust is very popular to create WASM stuff. So you can apply it to the JS world.

Happy 4th

Learn both. Go takes about 10minutes to write code in, a week to figure out harder stuff. Rust takes a few weeks. Both are good to know and fun to learn
I personally enjoy Rust more than Go, but if you’re considering the career angle then Go has a huge advantage of more jobs.

Rust has a steep learning curve, like you said, which is one reason why it won’t be nearly as common as Go in the workplace.

I think if you're in the front end world and likely to do more full stack work go is perfect for this, so its likely to lead to jobs in the next year or so.

Rust I like it but worry it hasn't really taken off as I expected. C++ seems resurgent. The C++ world is vast, perhaps you'll learn more with that and the skills will be more useful. Either C++ or Rust dont get used in full stack though so it really is a different world.

If you look to glue systems and add some new code at system level (not confuse it with OS level), the Golang is a better option. E.g. microservices, talk to databases, implement some distributed algorithm in your code.

Now if you plan to do number crunching, low level algorithm or scientific computing, Rust by all means. Unless you glue algos, then Python or Julia

Something that I'm very much interested in, too!

Tangential & important/useful to this question is:

"Ask HN: Great visual or other breakdowns of PL's & their categories/sub-c's?"

https://news.ycombinator.com/item?id=31919255

Posted over 5 days ago, sadly, there was zero responses.

Should I try reposting from scratch, or 1st w&s if this bump sparks things?

Ty

"Yes"

I personally find that even spending a little bit of time in a programming language with a different paradigm is incredibly helpful. So I'd suggest that Go is probably too similar to be maximally helpful, Rust is really good, but something like Haskell might give your brain a better workout even if you never actually use it for anything concrete.

If your priority is to get things done, do them in TypeScript unless you've a really good reason to learn another ecosystem at the same time. If your priority is to learn and get better at programming in general, digging into pretty much anything else will help. Just don't necessarily expect to get anything done.

Very pragmatic perspective. I find this helpful in that it defines a line between getting things done vs investing in my own growth. Before reading this, my thoughts on Go were that it was a better way of “getting things done” than how I do it now in TS, but you’ve shifted my perspective to it being more of a middle path. I am perfectly able to get things done in TS and then could supplement that with Rust for growth purposes. Thanks for taking the time to reply Andrew!
Depends on what do you mean by being a better coder. My take on what you can gain from learning each of these languages:

Go - concurrency with channels (that's a big one, gives you a good tool to think about concurrency even outside Go), appreciation of language minimalism

Rust - what it takes to have memory safety without garbage collector

Speaking of mental tools for dealing with concurrency I recommend looking at Clojure with its concurrency based on software transactional memory and immutability.

Hot take: Learning languages doesn't make you a better programmer. Solving real world problems makes you a better programmer. Whether you do that in Rust, Go, or Shellscript is a lot less important. Perhaps find a book or a series of talks about a topic you've struggled with in the past, say, maintainability, and see how you could do better in that area. Or learn more about the domain of your customers so that you understand their requirements better.
For the typical developer familiar with one or more C-style languages (Java, Ruby, JavaScript, Python, C, C++, Go, shell scripts, that kind of thing) and not much more, learning Rust will make you a better programmer, because it makes various kinds of sloppiness harder or impossible and forces you to be more careful about things like shared mutability, in a way that does transfer to your style in other languages, so that you’re much less likely to perpetrate various kinds of errors, among other improvements.

Source: myself and literally every other person that I’ve talked to about the matter.

Languages that change the way you think about expressing algorithms (e.g., Forth, Haskell, Lisp, Prolog, Smalltalk) are worth learning. Others are just reskins of languages you probably already know.
If your goal is to be a better coder long term, I’d suggest learning both. As many have pointed out, Go is quick to learn, and I think learning both will only take a small amount of extra time (compared to learning Rust).

They each present trade offs that make them a better tool under particular circumstances. While Rust exposes you to more sophisticated typesystem features, Go's M:N scheduler is an incredible piece of technology that is (IMO) unmatched by any other mainstream language.

Finally, regarding the garbage collector, if you learn both languages, you'll get to viscerally experience the tradeoffs of having the garbage collector (try writing the same program in each language). There are some projects where it makes sense to use one and others where you shouldn't. Trying out both is the best way to build up intuition for this kind of trade off.

I've tried both and failed.

It really depends on the goal. If one wants to end up with an elaborate hellow world, probably yes, one can learn both.

Learning Rust to make it applicable to mid/large-scale projects, and potentially for a professional transition (my case), is a one-of-a-kind commitment, in my opinion, hardly compatible with learning another language at the same time.

In that case, I'd suggest learning Go first, as a kind of "step up" to learning Rust. If you haven't already, I'd also suggest learning C.

I think there's some linearity to these tasks. Rust (and C++) are an amalgamation of many complex features that are present in simpler predecessors. Learning C for example will not only speed up your ability to learn Rust, but also leave you with a deeper understanding of the core principles.

Just replied to another comment recommending C. Can you help me understand which core principles C would help to refine i.e. what am I leaving on the table if I go with a Rust or C++?
Pointers :). C++ and Rust try to hide the concept away with References, which add a very helpful amount of type safety, but do not protect you from the fundamental idea of allocating memory and then later free-ing it.

It's not that you leave it on the table with Rust/C++ but more that you'll have a deeper understanding for what's going on if you understand how pointers work in C.

Thanks this is what I was looking for! Pointers are one of those things I’ve heard about for years but don’t know too much about. I know that in js objects are passed by copies of a reference to that object in memory. I have never felt that there was something missing here — only that it requires an understanding of which types in js are passed by value vs reference. What is the upside to pointers in C? For instance in js I can pass an object to a function that modifies the object’s properties. The only thing I can’t do (I think) is pass an object to a function, and then reassign that object’s reference to a new object literal such that the original object reference now references the new object literal. Is this gap in a language like js where pointers come in, or am I missing the forest for the trees? If this is where pointers become useful/beneficial to be knowledgeable on, can they really be that useful? Full disclaimer that I don’t know anything about pointers aside from implementing data structures in js e.g. a linked list node has a `this.next` property, but in other languages this seems to be called/implemented as a pointer from what I’ve seen.

To sum my thoughts on this up: can you help me understand why pointers would be useful for me to invest in learning on the level of C versus continuing to let them be abstracted away/not present in my language? What would that knowledge do for me? Will I be a better problem solver etc. thanks again!

It's not that there's an "advantage" to pointers, but rather it's the reality that they exist. Everything you're doing in JS also "uses" pointers under the hood, but the language and runtime abstract that away from you. C exposes you to pointers directly, so you have an opportunity to learn what they are and how they work.

It's important to learn how they work, because it'll give you a better idea of what's actually happening in the higher level languages you're using. That may not be important if you stick to JS or Go, but if you'd like to learn Rust then it's impossible to accurately think through tradeoffs like whether to use Box, Rc, Arc, etc. without understanding how pointers work. In other words, I'd only recommend learning Rust if you take the time to understand pointers, and the best way to understand pointers is to write C.

Nothing, these languages all expose the same underlying memory controls. But going with C may still be valuable, because rust and C++ has much better abstractions and especially with Rust, it can easily hide the pointer manipulation part from you, when that’s the reason one presumably learnt the language for.
Thanks, exactly what I was looking for!
> Just replied to another comment recommending C. Can you help me understand which core principles C would help to refine i.e. what am I leaving on the table if I go with a Rust or C++?

In the other thread you mention features. I suggest C because of its "simplicity", that is, its lack of features. It really is a thin abstraction on top of assembly. C's closeness to the hardware is edifying.

Moreover, since the goal is learning, History is quite relevant. Languages evolve in the context of their predecessors. You probably already know this for typescript since it is so close to JavaScript. But how do C++ and rust relate to C? And how does Go relate to C++ and C?

Languages always involve tradeoffs. For example, a language that checks memory bounds at runtime (Go) uses more CPU cycles than one that doesn't (C). A compiler that does checks is more complex than one that doesn't. Language features can help with safety (rust), but then the language takes more time to learn. Complexity can be hidden (Go garbage collection) to make up front learning easier, but this can make the language less flexible or more difficult to debug. Complexity can be exposed later but then the language learning curve is lengthened.

I'm not suggesting you go become a C pro, but learn enough to shoot yourself in the foot. It will help contextualize the features of these other languages and give your more mental tools for decision making in your own code.

> If you haven't already, I'd also suggest learning C.

Learning a new language is not something to take lightly. Should I take 6 months in order to get more solid foundations before moving to Rust? 1 year? N years?

My biggest hurdle has been ownership ("borrow checking", which is the common problem) in the broad sense (which includes: learning to design a whole program considering ownership). This is something that C/++ programmers are surely familiar with, so it absolutely helps, but I don't think it's efficient to learn C/++ in order to step up to Rust.

The more languages you learn, especially with reusable concepts, the less of a tax it is to learn a new one. As someone who has written C/C++ for over a decade, learning Rust felt very straightforward -- I just had to learn about the borrow checker, and it was fairly straightforward to reason about how it works based on my knowledge of unique pointers in C++.

I certainly don't think C++ is a prerequisite to learning Rust, but I do think your path to deeply understanding Rust will accelerate if you understand C (or specifically, understand pointers and heap allocations). But to each their own!

I come from Haskell and fought fiercely with the borrow checker for two months. We’re friends now.

I talked to a C programmer who said thinking in lifetimes (when to free()) was second nature, so didn’t even think heavily about it.

Learning new languages is certainly useful/important, but time is finite. The idea of learning a certain language as a bridge to another is unrealistic unless one has a _lot_ of time.
> Go's M:N scheduler is an incredible piece of technology that is (IMO) unmatched by any other mainstream language.

Java’s Loom will change the picture big time, and it is already available in preview mode! But otherwise I agree.

Afaik Go's scheduler is not unique. What does it do better then Haskell or Elixir?
It allows you to create many more language threads (go routines) than kernel threads, and unlike other languages properly hides this abstraction from you with a rope stack (so you don't need to create coroutines or use async/await syntax).

I'm not up to speed with the latest and greatest in Haskell or Elixir, so they very well may have something similar. Rust has great runtimes, like tokio, that do similar things, but without rope stacks and with painful async/await syntax.

A M:N Scheduler was neither revolutionary nor rare even when Go was launched. Even a mainstream like C# already had one (albeit based on continuations, until C# 5.0 came out). At the same time, some mainstream programming languages either had similar third-party M:N stackful schedulers when go came out (gevent in Python) or got them a little while after (Quasar in Java).

Go's scheduler was only somewhat unique in the combination of features it pursued:

1. M:N

2. Stackful (i.e. unoptimized memory usage for each task/goroutine)

3. But using very small stacks[1] so it's easier to create a very large number of goroutines.

4. Integrated with the GC

5. Colorless functions

6. Built-in

7. No access to native threads

8. Not configurable or customizable.

9. Run as Native code, without using a virtual machine.

Colored functions (Async/await or Kotlin's suspend) are a matter of taste. They're heavily criticized for the burden they add, but advocates prefer the extra type-safety they provide. If you want to be able to statistically analyze or data races (or prevent them completely, as Rust does), I don't think you can avoid them.

Speaking of Rust, Rust did start with an M:N, work-stealing scheduler based on stackful coroutines. This scheduler was eventually removed[2] from the standard library, since it was deemed a bad match for a systems language.

Go was originally marketed as a systems language, but it was really a language that was optimized for writing concurrent servers by large teams of programmers with varying experience[3]. Specifically it was designed for server software at Google[4], and to replace the main place C++ was used for in Google: I/O-bound server software. That's why Go made very radical choices:

- Go Native (we still need good performance, but not C++-level) - Maximize concurrency - Make concurrency easy - Use GC (we need the language to be much easier than C++) - Minimize GC pause times (we need reasonable performance at server workloads)

This meant that the Go M:N Scheduler was usually the best performing stackful scheduler for server loads for a while. Interpreted languages like Python, Node and Lua were slower and were either single-threaded or had a GIL. Erlang and Java used a VM, and weren't optimized for low latency GC. C and C++ had coroutines libraries, but since these languages were not garbage-collected, it was harder to optimize the coroutine stack size.

I think it created a wrong impression that the Go scheduler was revolutionary or best-in-class. It never was. The groundbreaking thing that Go did is to optimize the entire language for highly concurrent I/O-bound workloads. That, along with a sane (i.e. non-callback-based) asynchronous model and great PR from being a Google language helped Go popularize asynchronous programming.

But I wouldn't say it is unmatched by any mainstream language nowadays. Java has low-latency GC nowadays and it's working on it's own Go-like coroutine implementation (Project Loom). But all mainstream JVM languages (Kotlin, Scala and Clojure) already have their own M:N schedulers.

Rust, in the meantime, is strictly more performant than Go: It's using state-machine based stackless coroutines, which emulate the way that manual asynchronous implementations (like Nginx) are done in C. You can't get more efficient than that. Not to mention that Rust doesn't have a GC and features more aggressive compiler optimizations.

[1] IIRC, initial stack sizes has changed between 2k-8k during the language lifetime, and the stack resizing mechanism has changed as well.

[2] https://github.com/rust-lang/rfcs/blob/master/text/0230-remo...

[3] https://talks.golang.org/2012/...

> Go's M:N scheduler is an incredible piece of technology that is (IMO) unmatched by any other mainstream language.

I guess it depends how you define mainstream, but in Rust, Rayon has a work stealing scheduler too.

On the other hand, it has existed in Erlang for decades, and Elixir takes full advantage of it.

As for my 2c, I would say Rust is a better choice than Go in terms of the first language to learn. The main reason for this, is it is easy to embed in other languages. When I get to a problem that is too slow in a higher level language, eg. Python or Elixir, Rust is a great way to solve this problem. Just have a look at polars (https://www.pola.rs/).

I think it depends on your goals.

Do you want a job in the short-term? Choose Go.

Do you want a job in the long-term? Choose Rust.

But what if you already have a job?
If you already have a job and you don't want a new job neither on the short-term or long-term, you could:

- choose Go because: - it is easy to learn - it is fun - it is productive - it has good performance - it has good maintainability

Or you can:

- choose Rust if: - you have the time to learn the ins and outs - you have time to keep up with the never ending new features - you have interest in write software that is usually written in C or C++

What you need to have in mind is that both languages have benefits and trade-offs.

Go for example is easy to learn because is a small language but because of that you will need to write more code. Modern developers are usually averse to write lots of code. But write the amount of code that Go requires you to write will make you think better about what you are writing and at the end this will make you a better developer.

Rust takes time to learn and features keep bubbling up from time to time and some times development with Rust can be slow compared to other languages, but it is an excellent replacement for C or C++ if you are writing software for a supported architecture, because you will have the C/C++ performance without lots of bugs related to manual memory management.

Another thing to keep in mind is not to use Go or Rust when you should not use them. For example, you will see a lot of people using Rust for the sake of using Rust just because Rust is "memory safe", but Go is "memory safe" too; the difference is Go is garbage collected and Rust is not.

If you can afford a garbage collector in the software you are writing, don't waste your time with Rust if the software domain is one that Go excels, like networking programming.

But don't use Go for the sake of using Go as many people do, for example, trying to replace C or C++ with Go, because Go is not a replacement for C and C++.

I've been learning Rust for the past few weeks and have been enjoying it a lot.

- The community is very helpful on Discord (https://discord.com/invite/rust-lang-community).

- The package ecosystem (crates.io) makes it very easy to find and import things, and they're consistently documented.

- There's a path to compiling on web via WebAssembly (https://rustwasm.github.io/wasm-pack/)

In a few weeks of learning the language, I managed to put together this visualization: https://twitter.com/admiralakk/status/1542560489091350529

But realistically, either Go or Rust will be fine. You should pick the one you're more likely to stick with and learn, even when it gets tough. I've found the community aspect to be very helpful, because then at least I know I'm not the only idiot out there.

Learn both. Go in particular is quite simple. Rust will take a bit more time.
This kind of question is the reason why you'll never be good a good developer

> I am a full stack TypeScript dev looking to broaden my skill set by learning a new language. I’ve been weighing Rust vs Go for a long time but can’t really decide which would be a better use of my time. I often hear that people who try one of these languages after coming from something like TypeScript feel that they really level up their abilities/understanding.

I don't know if that's a joke or just misinformation

Hey thanks for the reply. This was really insightful and I really appreciate you taking the time! The most helpful part was definitely where you tell me I’ll never be a good dev because I ask questions I don’t already have the answer to :)
If you want to build web services, I'd go with Go. It has an http library in its standard library. It generally has a bigger standard library. Rust has a bigger stdlib than say C++, but it's still pretty anemic by the standards of modern languages. Go also compiles a lot faster than Rust, which is a major point.

If you like functional programming, or want to write embedded software, or high-performance software, I'd go with Rust. All those things are a lot easier in Rust.

Personally, I use Go for scripting and Rust for big projects, because Go compiles fast enough, has a nicer stdlib and dependency management than Python; while for big project my natural tendency to think functionally would make it too annoying having to translate simple concepts into programs twice as long as they need to be, expressing what they're doing very indirectly. But I don't write web services, so that's a different story.

I worked mainly in web dev for almost 2 decades now and having programmed both with Rust and Go, my vote would be to default for Rust, so I guess you everyone's mileage may vary.

Also the argument about the stdlib is kind of weird. It's a deliberate choice to keep the stdlib small, also because adding a new package to the projects takes a few seconds. If you were tasked to do a web backend with a limitation of "you can't use any external libraries" then yeah, I'd say Go might be easier, but otherwise there's almost no difference in practice