spinny:~/writing $ less rust-vs-go-comparison.md
12Rust 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.34Mas elas resolvem problemas diferentes de maneiras fundamentalmente diferentes. Neste artigo, comparamos as duas em todas as dimensões importantes para escolher a ferramenta certa.56## Visão Geral78| 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) |2021## Desempenho2223Rust 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.2425Go é 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.2627```rust28// Rust: Zero-cost abstractions29fn sum_even(numbers: &[i32]) -> i32 {30 numbers.iter()31 .filter(|&&n| n % 2 == 0)32 .sum()33}34```3536```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```4849Ambas 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.5051**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)5354## Segurança de Memória5556Esta é 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.5758```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```6768```go69// Go: nil can cause runtime panics70func main() {71 var s *string = nil72 fmt.Println(*s) // PANIC at runtime: nil pointer dereference73}74```7576Rust elimina categorias inteiras de bugs que Go (e a maioria das outras linguagens) só consegue detectar em tempo de execução.7778**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 uso8081## Concorrência8283Ambas as linguagens se destacam em concorrência, mas com abordagens muito diferentes.8485### Go: Goroutines8687O 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.8889```go90func fetchAll(urls []string) []string {91 results := make(chan string, len(urls))9293 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 }100101 var bodies []string102 for range urls {103 bodies = append(bodies, <-results)104 }105 return bodies106}107```108109### Rust: async/await + Tokio110111O modelo assíncrono do Rust é mais complexo, mas oferece mais controle. O compilador previne data races em tempo de compilação.112113```rust114use tokio;115use reqwest;116117async fn fetch_all(urls: Vec<String>) -> Vec<String> {118 let mut handles = vec![];119120 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 }130131 let mut results = vec![];132 for handle in handles {133 results.push(handle.await.unwrap());134 }135 results136}137```138139**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 zero141142## Experiência do Desenvolvedor143144### Go: Simplicidade Primeiro145146Go foi projetado para ser simples. A especificação da linguagem cabe em poucas páginas. Geralmente há uma maneira óbvia de fazer as coisas.147148- **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 dias152153### Rust: Poder com Complexidade154155Rust é mais difícil de aprender, mas recompensa com mais expressividade e segurança.156157- **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 internalizar161162```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)?;167168 let config: Config = serde_json::from_str(&content)169 .map_err(ConfigError::ParseError)?;170171 Ok(config)172}173```174175```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 }182183 var config Config184 if err := json.Unmarshal(content, &config); err != nil {185 return nil, fmt.Errorf("parsing config: %w", err)186 }187188 return &config, nil189}190```191192## Ecossistema e Casos de Uso193194### Onde Go Brilha195196- **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ápido201202### Onde Rust Brilha203204- **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, starship210211### Empresas que Usam Cada Uma212213| 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) |221222## Quando Escolher Go2232241. **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 simples229230## Quando Escolher Rust2312321. **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ória237238## Pode-se Usar Ambos?239240Sim. Muitas organizações usam ambos:241242- **Go** para serviços web, APIs e ferramentas DevOps243- **Rust** para componentes e bibliotecas de desempenho crítico244245Podem interoperar via FFI (Foreign Function Interface), gRPC ou APIs REST entre serviços.246247```mermaid248graph LR249 subgraph "Go Services"250 API[API Gateway\nGo]251 Auth[Auth Service\nGo]252 end253254 subgraph "Rust Services"255 Search[Search Engine\nRust]256 ML[ML Pipeline\nRust]257 end258259 API -- gRPC --> Search260 API -- gRPC --> Auth261 API -- gRPC --> ML262```263264## Conclusão265266Go e Rust são ambas linguagens excelentes, mas otimizam para coisas diferentes:267268- **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 aprender270271Se 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.272273A melhor escolha depende da sua equipe, suas restrições e suas prioridades. Ambas as linguagens servirão bem em 2026 e além.274
:Rust vs Go: Qual Linguagem Você Deve Escolher em 2026?lines 1-274 (END) — press q to close