· 6 min de lectura · Por Grover Cordova
Rust vs. Go: cómo elegir sin fanatismos
Diferencias reales entre Rust y Go en rendimiento, memoria, concurrencia, productividad y contratación, con criterios para decidir en tu equipo.
Rust y Go se comparan todo el tiempo, y es normal: ambos son modernos, compilan a binarios nativos y se usan para servicios de red. Pero nacieron para resolver problemas distintos. Elegir bien depende menos del lenguaje que de tu problema.
La diferencia de fondo
Go se diseñó para que equipos grandes escriban servicios concurrentes con poco esfuerzo: un lenguaje pequeño, compilación rápida y un recolector de basura que se encarga de la memoria.
Rust se diseñó para dar el control de C++ con garantías de seguridad: sin recolector, con un compilador que comprueba mucho más antes de ejecutar. Esa exigencia es su costo, y también su beneficio.
| Aspecto | Go | Rust |
|---|---|---|
| Memoria | Recolector de basura | Propiedad, sin recolector |
| Seguridad de memoria | Sí | Sí, salvo en unsafe |
| Carreras de datos | Posibles; hay detector en ejecución | No compilan en Rust seguro |
| Valores nulos | Existe nil | Option, comprobado al compilar |
| Errores | Valores que se revisan por convención | Result, y el compilador avisa si lo ignoras |
| Velocidad de compilación | Muy rápida | Más lenta |
| Curva de aprendizaje | Días o semanas | Semanas o meses |
| Binario | Incluye el entorno de ejecución | Sin entorno de ejecución obligatorio |
| Uso en embebidos | Limitado | Muy adecuado |
Rendimiento: lo que importa de verdad
En tareas limitadas por CPU, Rust suele sacar ventaja. Pero la diferencia que más se nota en producción no suele estar en el promedio, sino en la memoria y en la latencia de cola.
La guía oficial del recolector de Go es muy clara sobre esto: el recolector usa el 25 % de la CPU durante el marcado, y puede obligar a las rutinas a ayudarlo si se asigna mucha memoria. Si tu servicio guarda muchos datos en memoria, ese trabajo crece. Fue justo el caso de Discord.
Para ver el orden de magnitud, en nuestro microservicio de ejemplo medimos Rust, Go, Node.js y Python con el mismo endpoint.
Ahora bien, si tu servicio pasa casi todo el tiempo esperando a la base de datos, lo que ganes en el lenguaje apenas se notará. Mide antes. Astro lo mostró en 2026: al cambiar su compilador de Go a Rust ganó cerca de un 6 % en la compilación de su documentación, porque ese paso rara vez era el cuello de botella.
Concurrencia: dos filosofías
Go tiene una de sus mejores ideas en las gorrutinas: lanzar una tarea es tan simple como escribir go.
go procesar(pedido) // simple y directo
Rust usa async y await, normalmente con Tokio. Es más explícito, tiene más conceptos y más detalles que aprender. Lo que recibes a cambio es que el compilador impide compartir datos de forma insegura entre hilos.
use std::thread;
fn main() {
let pedido = String::from("A-100");
// `move` transfiere el dato al hilo: el compilador
// no permite que el hilo original lo siga usando.
let hilo = thread::spawn(move || println!("Procesando {pedido}"));
hilo.join().unwrap();
}
En Go, compartir un mapa entre gorrutinas sin protección compila sin aviso, y puede fallar en producción. Por eso existe go test -race, que es muy útil, pero solo detecta las carreras que ocurren durante la prueba. En Rust, ese error no llega a compilar.
Productividad: menos diferencia de la que se cree
Lo habitual es asumir que Go siempre será más productivo. Los datos disponibles son más matizados. En la conferencia Rust Nation 2024, Lars Bergstrom, de Google, comentó que los equipos de Rust eran tan productivos como los de Go en reescrituras comparables, y el doble que los de C++.
Conviene leer esto con prudencia: es una charla, no un estudio publicado, y Google no es una empresa promedio. Lo razonable es asumir que Go gana al inicio y que la distancia se reduce cuando el equipo domina Rust. Compilar sigue siendo más lento: en la encuesta interna de Google, solo algo más del 40 % consideraba aceptable la velocidad del compilador.
Contratación y ecosistema
Aquí Go suele llevar ventaja. Hay más perfiles disponibles, y cualquier persona con experiencia en backend aprende el lenguaje rápido. Su biblioteca estándar cubre muy bien HTTP y JSON, y buena parte de la infraestructura en la nube, como Kubernetes o Docker, está escrita en Go.
Rust exige formar a tu equipo o competir por menos perfiles. En cambio, llega a lugares donde Go no entra con facilidad: embebidos, navegador, sistemas operativos y bibliotecas para otros lenguajes.
Cuándo elegir cada uno
Elige Go si:
- Tu prioridad es entregar servicios de red rápido, con un equipo que rota o crece.
- La lógica de negocio pesa más que el rendimiento.
- Tu latencia objetivo se mide en decenas de milisegundos o más, y no tienes grandes cachés en memoria.
- Trabajas en el ecosistema de Kubernetes.
Elige Rust si:
- El p99 o la memoria son requisitos del negocio.
- Haces trabajo intensivo de CPU: procesar datos, comprimir, analizar, cifrar.
- Procesas datos no confiables en la ruta crítica.
- Necesitas llegar a embebidos, WebAssembly o bibliotecas para Python o Node.js.
- Un fallo sale muy caro, y prefieres pagar esa seguridad en tiempo de desarrollo.
No tienes que elegir uno solo. Muchas empresas combinan ambos: Go para la mayoría de servicios y Rust para los pocos componentes donde cada milisegundo o cada gigabyte cuenta.
La pregunta correcta
No es "¿cuál es mejor?", sino "¿qué problema tengo, y cuánto me cuesta?". Si aún no lo sabes, mide primero.
Fuentes
- A Guide to the Go Garbage CollectorThe Go Authors
- Data Race DetectorThe Go Authors
- Why Discord is switching from Go to RustDiscord, 2020
- Rust fact vs. fiction: 5 Insights from Google's Rust journey in 2022Google Open Source, 2023
- Rust Twice As Productive As C++I Programmer, sobre la charla de Lars Bergstrom, 2024
- The Rust Programming Language: Fearless ConcurrencyThe Rust Project