結論:シンプルさと学習コストの低さを取るなら Go、メモリ安全性と実行速度を極限まで求めるなら Rust。迷ったら先に Go で「型付き言語のプログラミング」に慣れ、必要になったら Rust の所有権に挑戦するのが遠回りに見えて一番早いです。
どちらも「モダンな言語」として名前が挙がりますが、設計思想がはっきり違います。ここでは両方とも実在するブラウザ実行つきの無料コースを触りながら、違いを体感できるように解説します。
Go と Rust はそもそも何が違うのか
一言でいうと、Go は「読みやすさとシンプルさ」を、Rust は「安全性と性能」を最優先に設計された言語です。
- Go:文法がとても小さい。ループは
forの1種類だけ、例外機構もなくerrorを戻り値として返すだけ。ガベージコレクション(GC)があるのでメモリ管理を自分で意識する場面はほぼありません。並行処理(goroutine・channel)が言語標準で組み込まれているのも特徴です。 - Rust:GC を持たず、コンパイル時に「所有権(ownership)」というルールでメモリの安全性を保証します。実行時のオーバーヘッドがほぼゼロなので、C/C++並みの速度が出ます。その代わり、コンパイラがかなり厳格にチェックするため、書き始めは「コンパイルが通らない」という壁にぶつかりやすいです。
どちらも静的型付け・コンパイル言語という共通点はありますが、「GCで楽をするGo」と「GCなしで安全を保証するRust」という対極の選択をしていると考えると整理しやすいです。
実際に手を動かして違いを感じたい場合は、Goコースのはじめの一歩 と Rustコースのはじめの一歩 を両方ブラウザで開いてみてください。環境構築なし・登録不要でその場で実行できます。同じ「Hello, World」でも、Rust の println! が関数ではなくマクロ(! が付く理由)である点など、最初の1行から設計思想の違いが見えてきます。
用途で選ぶならどっち
- Web API・マイクロサービス・CLIツール・インフラ系ツール(Docker/Kubernetesの周辺エコシステムなど):Go が圧倒的に強い分野です。標準ライブラリだけでHTTPサーバーが書け、ビルドも実行も速いのでチーム開発・大量サービス運用と相性が良いです。
- OS・組み込み・ブラウザエンジン・ゲームエンジン・パフォーマンスが命の基盤ソフトウェア:Rust が選ばれやすい分野です。GCによる予測不能な一時停止(GCポーズ)がなく、C/C++が担っていた領域を安全に置き換えられます。
- 並行処理そのものを学びたい:Go は goroutine ― 処理を同時に走らせる と channel ― goroutine 間で値を受け渡す、複数の goroutine を待つ ― WaitGroup のように、言語標準機能として素直に並行処理を書けます。Rust は所有権のおかげでデータ競合をコンパイル時に防げる設計(恐れないマルチスレッド ― 所有権が並行を安全にする)ですが、そこに到達するまでに所有権と借用の理解が前提になります。
どちらも「モダンな開発」の主力言語ですが、迷ったら「今作りたいものは何か」で選ぶのが一番失敗しません。Webサービス寄りならGo、性能・安全性のクリティカルな領域ならRust、という住み分けです。
学習難易度の違い ― Rustの所有権という壁
学習コストの差は主に「所有権・借用」の有無から来ています。
Go は 型変換 ― 暗黙の変換はしない のような多少の厳格さはあるものの、基本的には「書いたとおりに動く」感覚で進められます。文法自体が小さいので、Goコース は全24レッスンのうち大半がブラウザでそのまま実行できる構成になっています(go-20 のパッケージ・モジュール解説と go-21 の goroutine 概念は読み物ですが、それ以外はコードを書いてすぐ結果を確認できます)。
一方 Rust は、所有権の3つのルール から始まり、ムーブ(move)― 所有権が移る、参照と借用 ― & で貸す、借用のルール ― データ競合を防ぐ と続く一連の章が最大の関門です。ここで多くの初心者が「コンパイルエラーが直せない」と挫折しかけます。ただしこれは裏を返せば、Rustのコンパイラが「実行前にバグを教えてくれている」ということでもあります。Rustコース はこの核心部分(第3〜5章のメモリ・所有権・借用・ライフタイム)を特に厚く扱っており、rust-15〜rust-21 などはブラウザで実際にムーブやクローンの挙動を試しながら理解できます。
つまずきやすいところ
Rust の所有権まわりでは、次のようなコンパイルエラーに必ず出会います。
- 一度ムーブした値をまた使おうとして起きる
E0382: borrow of moved value - 可変な借用を同時に2つ作ろうとして起きる
E0499: cannot borrow as mutable more than once - 不変借用が生きている間に値を書き換えようとして起きる
E0502
これらはバグではなく「Rustが正しく機能している証拠」です。詳しい原因と直し方は Rustのエラー逆引き を参照してください。unwrap() を None に対して呼んで panic するケースなど、実行時エラーの対処法も揃っています。
Go 側でつまずきやすいのは、コンパイルエラーよりも実行時パニックです。特に多いのが nil マップへの書き込み(assignment to entry in nil map)や、初期化していないポインタを参照してしまう nil pointer dereference です。こちらは Goのエラー逆引き にそれぞれ対処法があるので、詰まったら検索するより先に見てみてください。
次に読む
- Goコース トップ ― 全24レッスン。基本文法から並行処理(goroutine/channel)まで、ほとんどがブラウザで実行できます。
- Rustコース トップ ― 全43レッスン。所有権・借用・ライフタイムという核心部分を厚めに解説し、スマートポインタや並行処理まで進みます。
- Goのエラー逆引き ― nil map・nilポインタ・型不一致などの実行時/コンパイルエラーの対処法。
- Rustのエラー逆引き ― 所有権・借用まわりのコンパイルエラー(E0382/E0499/E0502など)の読み方と直し方。
- はじめの一歩から比較したい人は はじめての Go ― Hello, World と はじめての Rust ― Hello, Cargo を両方開いて、同じ「文字を出す」だけのコードの違いを見比べてみてください。