spinny:~/writing $ less rust-vs-go-comparison.md
12Rust и Go - два самых обсуждаемых системных языка программирования в 2026 году. Rust был назван "самым любимым языком" в каждом опросе Stack Overflow с 2016 года. Go обеспечивает работу одних из самых критически важных инфраструктур в интернете, от Docker и Kubernetes до пограничной сети Cloudflare.34Но они решают разные проблемы принципиально разными способами. В этой статье мы сравним их по всем измерениям, важным для выбора правильного инструмента.56## Обзор78| Аспект | Rust | Go |9|--------|------|-----|10| **Создан** | Mozilla (2010) | Google (2009) |11| **Система типов** | Статическая, строгая, с владением | Статическая, строгая, проще |12| **Управление памятью** | Владение + заимствование (без GC) | Сборщик мусора |13| **Параллелизм** | async/await, потоки, каналы | Горутины + каналы |14| **Компиляция** | Медленнее | Очень быстрая |15| **Размер бинарника** | Маленький, статический | Маленький, статический |16| **Кривая обучения** | Крутая | Пологая |17| **Обработка ошибок** | Типы Result/Option | Множественные возвращаемые значения |18| **Null-безопасность** | Нет null (тип Option) | Есть nil |19| **Дженерики** | Да (с 1.0) | Да (с 1.18) |2021## Производительность2223Rust обеспечивает производительность, сравнимую с C и C++, без пауз сборщика мусора. Он дает вам полный контроль над расположением и выделением памяти.2425Go быстрый - намного быстрее Python, JavaScript или Java - но у него есть сборщик мусора, который может вызывать всплески задержки в приложениях с критическими требованиями к производительности.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```4849Оба компилируются в нативный код. Разница в том, что абстракции Rust (итераторы, замыкания) компилируются в тот же машинный код, что и написанные вручную циклы, тогда как простота Go иногда означает меньший потенциал оптимизации.5051**Выбирайте Rust если**: важна задержка менее миллисекунды (торговые системы, игровые движки, встроенные системы)52**Выбирайте Go если**: пропускная способность важнее задержки (веб-сервисы, CLI-инструменты, DevOps)5354## Безопасность памяти5556Это определяющая особенность Rust. Система владения обнаруживает ошибки памяти во время компиляции - никаких разыменований нулевых указателей, никаких гонок данных, никаких обращений к освобожденной памяти.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 устраняет целые категории багов, которые Go (и большинство других языков) может обнаружить только во время выполнения.7778**Выбирайте Rust если**: безопасность критична (криптография, компоненты ОС, браузеры)79**Выбирайте Go если**: гарантий безопасности сборщика мусора достаточно для вашего случая8081## Параллелизм8283Оба языка преуспевают в параллелизме, но с очень разными подходами.8485### Go: Горутины8687Модель параллелизма Go проста и элегантна. Горутины - это легковесные потоки, управляемые средой выполнения Go, а каналы обеспечивают безопасную коммуникацию между ними.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 + Tokio110111Асинхронная модель Rust сложнее, но дает больше контроля. Компилятор предотвращает гонки данных во время компиляции.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**Выбирайте Go если**: вам нужен простой, понятный параллелизм140**Выбирайте Rust если**: вам нужна гарантированная потокобезопасность и асинхронность с нулевой стоимостью141142## Опыт разработчика143144### Go: Простота прежде всего145146Go был спроектирован для простоты. Спецификация языка умещается в несколько страниц. Обычно есть один очевидный способ сделать что-то.147148- **Быстрая компиляция**: Go компилируется почти мгновенно149- **Все включено**: net/http, encoding/json, testing - всё в стандартной библиотеке150- **gofmt**: один стиль форматирования, никаких споров151- **Легко учить**: Java/Python-разработчик может быть продуктивным за дни152153### Rust: Мощность с комплексностью154155Rust сложнее в изучении, но вознаграждает большей выразительностью и безопасностью.156157- **Медленная компиляция**: borrow checker и мономорфизация требуют времени158- **Cargo**: отличный пакетный менеджер и инструмент сборки159- **Богатая система типов**: enum, сопоставление с образцом, трейты, дженерики160- **Крутая кривая**: модель владения требует недель для усвоения161162```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## Экосистема и варианты использования193194### Где блистает Go195196- **Облачная инфраструктура**: Docker, Kubernetes, Terraform, Prometheus197- **Веб-сервисы и API**: Быстрые HTTP-серверы с net/http или Gin/Fiber198- **CLI-инструменты**: cobra, urfave/cli199- **DevOps-инструменты**: большинство облачно-нативных инструментов написано на Go200- **Микросервисы**: простой деплой, маленькие бинарники, быстрый запуск201202### Где блистает Rust203204- **Системное программирование**: компоненты ОС, драйверы, встроенные системы205- **WebAssembly**: первоклассная поддержка WASM206- **Сервисы с критической производительностью**: Cloudflare Workers, система сообщений Discord207- **Блокчейн**: Solana, Polkadot, множество крипто-проектов208- **Игровые движки**: движок Bevy209- **CLI-инструменты**: ripgrep, bat, fd, starship210211### Компании, использующие каждый язык212213| Go | Rust |214|----|------|215| Google (Kubernetes, gRPC) | Mozilla (Firefox) |216| Docker | Cloudflare (Workers) |217| Uber | Discord (хранение сообщений) |218| Twitch | Dropbox (синхронизация файлов) |219| Hashicorp (Terraform) | AWS (Firecracker) |220| Cloudflare | Microsoft (компоненты Windows) |221222## Когда выбрать Go2232241. **Создание веб-сервисов и API** - простота Go и net/http делают его идеальным2252. **Ваша команда новичок в системном программировании** - кривая обучения Go гораздо мягче2263. **Нужна быстрая итерация** - Go компилируется мгновенно, отлично для быстрого прототипирования2274. **DevOps и инфраструктурные инструменты** - экосистема не имеет аналогов2285. **Микросервисы** - маленькие бинарники, быстрый запуск, простой деплой229230## Когда выбрать Rust2312321. **Производительность не подлежит обсуждению** - абстракции с нулевой стоимостью, без пауз GC2332. **Безопасность превыше всего** - гарантии безопасности памяти предотвращают целые классы багов2343. **WebAssembly** - первоклассная поддержка WASM2354. **Встроенные системы** - без рантайма, без GC, предсказуемая производительность2365. **Замена C/C++** - та же производительность с безопасностью памяти237238## Можно ли использовать оба?239240Да. Многие организации используют оба:241242- **Go** для веб-сервисов, API и DevOps-инструментов243- **Rust** для компонентов и библиотек с критической производительностью244245Они могут взаимодействовать через FFI (Foreign Function Interface), gRPC или REST API между сервисами.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## Заключение265266Go и Rust - оба отличные языки, но они оптимизируют разные вещи:267268- **Go оптимизирует простоту** - быстро учить, быстро компилировать, быстро выпускать269- **Rust оптимизирует корректность** - безопасный, быстрый, выразительный, но сложнее в изучении270271Если вы создаете веб-сервисы, API или DevOps-инструменты и хотите двигаться быстро, выбирайте Go. Если вы создаете программное обеспечение с критической производительностью, критической безопасностью или системного уровня, выбирайте Rust.272273Лучший выбор зависит от вашей команды, ваших ограничений и ваших приоритетов. Оба языка будут хорошо служить вам в 2026 году и далее.274
:Rust vs Go: Какой язык выбрать в 2026 году?lines 1-274 (END) — press q to close