spinny:~/writing $ vim rust-vs-go-comparison.md
1~2Rust e Go são as duas linguagens de programação de sistemas mais discutidas em 2026. Rust foi votada como a "linguagem mais amada" em todas as pesquisas do Stack Overflow desde 2016. Go alimenta algumas das infraestruturas mais críticas da internet, de Docker e Kubernetes à rede edge da Cloudflare.3~4Mas elas resolvem problemas diferentes de maneiras fundamentalmente diferentes. Neste artigo, comparamos as duas em todas as dimensões importantes para escolher a ferramenta certa.5~6## Visão Geral7~8| Aspecto | Rust | Go |9|---------|------|-----|10| **Criada por** | Mozilla (2010) | Google (2009) |11| **Sistema de tipos** | Estático, forte, com ownership | Estático, forte, mais simples |12| **Gerenciamento de memória** | Ownership + borrowing (sem GC) | Garbage collector |13| **Concorrência** | async/await, threads, canais | Goroutines + canais |14| **Compilação** | Mais lenta | Muito rápida |15| **Tamanho do binário** | Pequeno, estático | Pequeno, estático |16| **Curva de aprendizado** | Íngreme | Suave |17| **Tratamento de erros** | Tipos Result/Option | Múltiplos valores de retorno |18| **Segurança null** | Sem null (tipo Option) | Tem nil |19| **Generics** | Sim (desde 1.0) | Sim (desde 1.18) |20~21## Desempenho22~23Rust produz desempenho comparável a C e C++, sem pausas do garbage collector. Dá a você controle completo sobre layout e alocação de memória.24~25Go é rápido - muito mais rápido que Python, JavaScript ou Java - mas tem um garbage collector que pode introduzir picos de latência em aplicações com requisitos críticos de desempenho.26~27```rust28// Rust: Zero-cost abstractions29fn sum_even(numbers: &[i32]) -> i32 {30 numbers.iter()31 .filter(|&&n| n % 2 == 0)32 .sum()33}34```35~36```go37// Go: Simple and clear38func sumEven(numbers []int) int {39 sum := 040 for _, n := range numbers {41 if n%2 == 0 {42 sum += n43 }44 }45 return sum46}47```48~49Ambas compilam para código nativo. A diferença é que as abstrações do Rust (iteradores, closures) compilam para o mesmo código de máquina que loops escritos à mão, enquanto a simplicidade do Go às vezes significa menos potencial de otimização.50~51**Escolha Rust se**: latência abaixo de milissegundos importa (sistemas de trading, motores de jogos, embarcados)52**Escolha Go se**: throughput importa mais que latência (serviços web, ferramentas CLI, DevOps)53~54## Segurança de Memória55~56Esta é a característica definidora do Rust. O sistema de ownership captura bugs de memória em tempo de compilação - sem desreferenciação de ponteiro nulo, sem data races, sem use-after-free.57~58```rust59// Rust: This won't compile - ownership prevents use-after-free60fn main() {61 let s1 = String::from("hello");62 let s2 = s1; // s1 is moved to s263 // println!("{}", s1); // ERROR: s1 is no longer valid64 println!("{}", s2); // OK65}66```67~68```go69// Go: nil can cause runtime panics70func main() {71 var s *string = nil72 fmt.Println(*s) // PANIC at runtime: nil pointer dereference73}74```75~76Rust elimina categorias inteiras de bugs que Go (e a maioria das outras linguagens) só consegue detectar em tempo de execução.77~78**Escolha Rust se**: segurança é crítica (criptografia, componentes do SO, navegadores)79**Escolha Go se**: as garantias de segurança do garbage collector são suficientes para seu caso de uso80~81## Concorrência82~83Ambas as linguagens se destacam em concorrência, mas com abordagens muito diferentes.84~85### Go: Goroutines86~87O modelo de concorrência do Go é simples e elegante. Goroutines são threads leves gerenciadas pelo runtime do Go, e canais permitem comunicação segura entre elas.88~89```go90func fetchAll(urls []string) []string {91 results := make(chan string, len(urls))92~93 for _, url := range urls {94 go func(u string) {95 resp, _ := http.Get(u)96 body, _ := io.ReadAll(resp.Body)97 results <- string(body)98 }(url)99 }100~101 var bodies []string102 for range urls {103 bodies = append(bodies, <-results)104 }105 return bodies106}107```108~109### Rust: async/await + Tokio110~111O modelo assíncrono do Rust é mais complexo, mas oferece mais controle. O compilador previne data races em tempo de compilação.112~113```rust114use tokio;115use reqwest;116~117async fn fetch_all(urls: Vec<String>) -> Vec<String> {118 let mut handles = vec![];119~120 for url in urls {121 handles.push(tokio::spawn(async move {122 reqwest::get(&url)123 .await124 .unwrap()125 .text()126 .await127 .unwrap()128 }));129 }130~131 let mut results = vec![];132 for handle in handles {133 results.push(handle.await.unwrap());134 }135 results136}137```138~139**Escolha Go se**: você quer concorrência simples e fácil de entender140**Escolha Rust se**: você precisa de segurança de threads garantida e async de custo zero141~142## Experiência do Desenvolvedor143~144### Go: Simplicidade Primeiro145~146Go foi projetado para ser simples. A especificação da linguagem cabe em poucas páginas. Geralmente há uma maneira óbvia de fazer as coisas.147~148- **Compilação rápida**: Go compila quase instantaneamente149- **Baterias incluídas**: net/http, encoding/json, testing - tudo na biblioteca padrão150- **gofmt**: um estilo de formatação, sem debates151- **Fácil de aprender**: um desenvolvedor Java/Python pode ser produtivo em dias152~153### Rust: Poder com Complexidade154~155Rust é mais difícil de aprender, mas recompensa com mais expressividade e segurança.156~157- **Compilação mais lenta**: o borrow checker e a monomorfização levam tempo158- **Cargo**: excelente gerenciador de pacotes e ferramenta de build159- **Sistema de tipos rico**: enums, pattern matching, traits, generics160- **Curva mais íngreme**: o modelo de ownership leva semanas para internalizar161~162```rust163// Rust's expressive error handling164fn parse_config(path: &str) -> Result<Config, ConfigError> {165 let content = std::fs::read_to_string(path)166 .map_err(ConfigError::IoError)?;167~168 let config: Config = serde_json::from_str(&content)169 .map_err(ConfigError::ParseError)?;170~171 Ok(config)172}173```174~175```go176// Go's straightforward error handling177func parseConfig(path string) (*Config, error) {178 content, err := os.ReadFile(path)179 if err != nil {180 return nil, fmt.Errorf("reading config: %w", err)181 }182~183 var config Config184 if err := json.Unmarshal(content, &config); err != nil {185 return nil, fmt.Errorf("parsing config: %w", err)186 }187~188 return &config, nil189}190```191~192## Ecossistema e Casos de Uso193~194### Onde Go Brilha195~196- **Infraestrutura cloud**: Docker, Kubernetes, Terraform, Prometheus197- **Serviços web e APIs**: Servidores HTTP rápidos com net/http ou Gin/Fiber198- **Ferramentas CLI**: cobra, urfave/cli199- **Ferramentas DevOps**: a maioria das ferramentas cloud-native são escritas em Go200- **Microsserviços**: deploy simples, binários pequenos, startup rápido201~202### Onde Rust Brilha203~204- **Programação de sistemas**: componentes do SO, drivers, embarcados205- **WebAssembly**: suporte WASM de primeira classe206- **Serviços de desempenho crítico**: Cloudflare Workers, sistema de mensagens do Discord207- **Blockchain**: Solana, Polkadot, muitos projetos cripto208- **Motores de jogos**: Bevy engine209- **Ferramentas CLI**: ripgrep, bat, fd, starship210~211### Empresas que Usam Cada Uma212~213| Go | Rust |214|----|------|215| Google (Kubernetes, gRPC) | Mozilla (Firefox) |216| Docker | Cloudflare (Workers) |217| Uber | Discord (armazenamento de mensagens) |218| Twitch | Dropbox (sincronização de arquivos) |219| Hashicorp (Terraform) | AWS (Firecracker) |220| Cloudflare | Microsoft (componentes Windows) |221~222## Quando Escolher Go223~2241. **Construir serviços web e APIs** - a simplicidade do Go e net/http o tornam ideal2252. **Sua equipe é nova em programação de sistemas** - a curva de aprendizado do Go é muito mais suave2263. **Você precisa de iteração rápida** - Go compila instantaneamente, ótimo para prototipagem rápida2274. **Ferramentas DevOps e infraestrutura** - o ecossistema é incomparável2285. **Microsserviços** - binários pequenos, startup rápido, deploy simples229~230## Quando Escolher Rust231~2321. **Desempenho não é negociável** - abstrações de custo zero, sem pausas do GC2332. **Segurança é primordial** - garantias de segurança de memória previnem classes inteiras de bugs2343. **WebAssembly** - suporte WASM de primeira classe2354. **Sistemas embarcados** - sem runtime, sem GC, desempenho previsível2365. **Substituir C/C++** - mesmo desempenho com segurança de memória237~238## Pode-se Usar Ambos?239~240Sim. Muitas organizações usam ambos:241~242- **Go** para serviços web, APIs e ferramentas DevOps243- **Rust** para componentes e bibliotecas de desempenho crítico244~245Podem interoperar via FFI (Foreign Function Interface), gRPC ou APIs REST entre serviços.246~247```mermaid248graph LR249 subgraph "Go Services"250 API[API Gateway\nGo]251 Auth[Auth Service\nGo]252 end253~254 subgraph "Rust Services"255 Search[Search Engine\nRust]256 ML[ML Pipeline\nRust]257 end258~259 API -- gRPC --> Search260 API -- gRPC --> Auth261 API -- gRPC --> ML262```263~264## Conclusão265~266Go e Rust são ambas linguagens excelentes, mas otimizam para coisas diferentes:267~268- **Go otimiza para simplicidade** - rápido de aprender, rápido de compilar, rápido de entregar269- **Rust otimiza para correção** - seguro, rápido, expressivo, mas mais difícil de aprender270~271Se você está construindo serviços web, APIs ou ferramentas DevOps e quer se mover rápido, escolha Go. Se está construindo software de desempenho crítico, segurança crítica ou nível de sistema, escolha Rust.272~273A melhor escolha depende da sua equipe, suas restrições e suas prioridades. Ambas as linguagens servirão bem em 2026 e além.274~
NORMAL · rust-vs-go-comparison.md [readonly]274 lines · :q to close