Rust vs Go vs C++
Los tres lenguajes compiten en sectores similares: programación de sistemas, backend de alto rendimiento, herramientas de línea de comandos, infraestructura…

Si tuviéramos que caracterizar cada lenguaje con una única frase:
- C++: Potencia máxima, control absoluto, complejidad extrema.
- Go: Productividad máxima, simplicidad, con recolector de basura.
- Rust: Potencia y seguridad, sin recolector de basura, curva de aprendizaje pronunciada.
Pros y contras de Rust
¿En qué tipo de proyectos encaja bien Rust?
- Proyectos donde la seguridad de memoria es crítica.
- Proyectos que van a ser mantenidos durante años.
- Sistemas embebidos con altos requisitos de seguridad.
Puntos clave en los que destaca Rust
Seguridad: El compilador elimina clases enteras de errores. No hay errores relacionados con null pointer, dangling pointers, double free, no hay memory leaking accidental…
Rendimiento: El código compilado es comparable al que genera C++. Pero el compilador te protege de errores sutiles.
Herramientas integradas: Entorno de desarrollo moderno que incluye gestión de dependencias, testing…
Mantenibilidad: El compilador obliga a ser estricto con el código y favorece la creación de código robusto. Además, el sistema de tipos de Rust permite crear código muy expresivo, con muchísimas salvaguardas que hacen más difícil cometer errores durante la evolución y mantenimiento del programa.
Concurrencia: La concurrencia es trivial en Rust. El compilador garantiza que no habrá condiciones de carrera ni cualquier otro tipo de problema relacionado con la memoria, incluso en entornos altamente concurrentes.
Puntos menos positivos de Rust
Curva de aprendizaje: Es un lenguaje muy exigente y frustrante durante la primera etapa de aprendizaje.
Tiempo de compilación: Los proyectos grandes pueden tardar minutos en compilar. El uso incremental ayuda.
Ecosistema joven: Menos bibliotecas que C++ o Go. Aunque es un ecosistema que crece rápidamente.
Pros y contas de Go
¿En qué tipo de proyectos encaja bien Go?
- Desarrollos en los que se necesitan resultados rápidos.
- Equipos que priorizan mantenibilidad sobre flexibilidad.
- Proyectos de backend y microservicios.
- Equipo de desarrollo muy vinculado a Python o JavaScript.
Puntos fuertes de Go
Productividad extrema: Se puede escribir un servidor HTTP funcional en 10 minutos. La sintaxis es mínima y consistente.
Recolector de basura moderno: No tiene los problemas ni el impacto negativo sobre el rendimiento que tienen los sistemas de recolección tradicionales. Go sigue siendo rápido incluso con millones de peticiones.
Herramientas integradas: Testing, benchmarking, fuzzing… Todo viene incluido. No necesitas configurar nada.
Gran biblioteca estándar: Para casi todo lo que necesites, hay un paquete oficial.
Concurrencia: Muy fácil de implementar en Go.
Puntos menos positivos
Sin genéricos hasta versiones relativamente recientes: Ahora tiene, pero la comunidad todavía se está adaptando.
El recolector de basura no es opcional: Para sistemas embebidos con memoria limitada, esto es un problema.
Monótono para programas grandes: Sin traits o genéricos potentes, el código puede volverse repetitivo.
Pros y contras de C++
¿En qué tipo de proyectos o equipos encaja bien C++?
- Equipos de desarrollo que ya tienen mucha experiencia en C++.
- Proyectos legacy basados en C++.
- Desarrollo orientado a sistemas, simulación, juegos, etc. en los que las principales librerías están desarrolladas en C/C++.
- En desarrollo de sistemas embebidos se sigue utilizando mucho C, pero también C++ “legacy” (C con clases).
Puntos en los que destaca C++
Control absoluto: Cada byte de memoria está bajo tu control. No hay abstracciones que limiten.
Ecosistema maduro: Puedes encontrar bibliotecas para casi cualquier cosa. Décadas de código disponible.
Rendimiento máximo: Cuando cada nanosegundo cuenta, C y C++ pueden llegar a generar código máquina muy optimizado.
Interoperabilidad: Con todos los sistemas y librerías de C.
Cosas menos positivas
Curva de aprendizaje: Incluso más difícil que Rust, sobre todo los conceptos de la parte de C++ “moderno”. Hay que tener en cuenta que C++ tiene a sus espaldas una evolución de más de 30 años, con la premisa de que cualquier nueva versión tiene que ser retrocompatible con todo el código existente.
Errores de memoria: Al final, la responsabilidad de la gestión de memoria recae en el programador. Hay errores que pueden permanecer latentes durante años y provocar eventos de inesperados que son muy difíciles de depurar.
Compilación lenta: Los proyectos grandes pueden tardar horas en compilar.
Concurrencia manual: No es trivial implementar concurrencia en C++ porque es el programador el que tiene que verificar todas las salvaguardas y técnicas necesarias para garantizar la correcta gestión de la memoria y los recursos.
Criterios para elegir según la temática del proyecto
Los criterios que comento en este apartado son en realidad pautas muy generales, con la idea de ofrecer una visión orientativa.
En un proyecto real hay que tener en cuenta muchas más cosas. Supongamos que todos los demás factores no afectan demasiado y que tenemos libertad total para elegir el lenguaje de programación que mejor se adapta a ese tipo de proyecto.
Backend y APIs
Opciones ganadoras: Go, seguido de Rust.
Go fue diseñado para esto. La concurrencia con goroutines es trivial.
Rust tiene frameworks como Actix o Axum que son rápidos, pero un poco más complejos.
C++ tiene bibliotecas como Restbed, pero en general es bastante más compleja la programación.
Sistemas embebidos
Opciones ganadoras: Rust, o C++ para proyectos “legacy”.
En sistemas embebidos sigue dominando C, ni siquiera C++. Se pueden encontrar librerías de C para cualquier dispositivo o situación. El problema de C es que todo cae en manos del programador. Es muy difícil desarrollar y mantener código sin que tarde o temprano haya algún error relacionado con la gestión de memoria: punteros nulos, huérfanos, acceso a zonas de memoria no permitidas…
Rust tiene abstracciones de coste cero que compilan a código muy similar a C. Pero con criterios de seguridad muy elevados. Ya hay bastantes librerías que cubren muchos de los microcontroladores y microprocesadores más conocidos.
Si el proyecto no requiere drivers o librerías muy específicas que sólo existen en C, mi elección para nuevos proyectos sería Rust.
Go tiene requisitos de memoria que no funcionan bien para sistemas embebidos.
Videojuegos y gráficos
Opciones ganadoras: C++, o C# si se trabaja con el motor Unity
La industria del videojuego tiene décadas de código en C++. Por ejemplo los desarrollos basados en Unreal.
Rust tiene Bevy, pero el ecosistema es pequeño.
Go ni siquiera está en ese mundo (hasta donde yo sé).
Infraestructura en la nube
Opciones ganadoras: Go
Kubernetes, Docker, Prometheus, Crossplane… están desarrollados en Go. Podríamos decir que Go es una especie de estándar de facto para software de infraestructura y la nube.
Seguridad y criptografía
Opciones ganadoras: Rust, C/C++ para proyectos “legacy”
Hoy en día, Rust es posiblemente la mejor elección. Combina el rendimiento de C++ con un sistema de tipos que garantiza la seguridad de la memoria y unos estándares que facilitan el mantenimiento y minimizan las brechas de seguridad.
Librerías como ring, RustCrypto, rustls, etc. son excelentes, auditadas por expertos y cada vez son más utilizadas en nuevos proyectos.
Por otro lado, muchos proyectos de largo recorrido, como OpenSSL, están desarrollados en C. Si el proyecto necesita interactuar con librerías de C o se trata de la evolución de un proyecto existente, probablemente C/C++ sea la opción con menos fricción.
Aprendizaje / inferencia
Opciones ganadoras: C++
PyTorch, TensorFlow y la mayoría de bibliotecas que más se utilizan están en C++. Python es la API sobre la que se programa a alto nivel, pero C++ es el motor de muchas de las librerías que utiliza por debajo.
Rust tiene burn por ejemplo, pero está en fase temprana.
No conozco herramientas o librerías de este tipo en Go.
Conclusión
Los lenguajes de programación son herramientas. No hay lenguajes mejores o peores.
Cada uno de ellos tiene puntos fuertes y puntos débiles. Cada uno tiene su propio ecosistema, su comunidad y su historia.
La elección del lenguaje de desarrollo para un proyecto depende en la práctica de muchísimos factores: tipo de proyecto, el perfil de los programadores del equipo de desarrollo, los objetivos a corto, medio y largo plazo del proyecto, la necesidad de librerías muy especializadas, la experiencia acumulada en esa temática por la comunidad…
En este artículo solo he pretendido dar una visión muy somera (y seguramente sesgada) de estos tres lenguajes que compiten o conviven en ciertos sectores.
Otros artículos que te podrían interesar: