パッケージとモジュール — Gemfileがgo.modになった時
Rubyのrequire/gemシステム vs Goのpackage/moduleシステム
Rubyで外部ライブラリを使うには:Gemfileにgem 'rails'を追加してbundle installを実行。
Goでは:go get github.com/gin-gonic/ginを実行するとgo.modに自動追加。
Gemfile vs go.mod
RubyのGemfileはgem名とバージョン制約を書く:gem 'rails', '~> 7.0'
Goのgo.modはモジュールパス(通常GitHub URL)とバージョンを書く:require github.com/gin-gonic/gin v1.9.1
最大の違い:RubyGemsという中央レジストリがありgem install railsで名前だけでインストール。Goは中央レジストリなしでGitHub URLがパッケージ識別子。
require vs import
Ruby: require 'json' — ファイル名またはgem名でロード。
Go: import "encoding/json" — パッケージパスでimport。使っていないimportがあるとコンパイルエラー。Rubyではrequireしても使わなくてもエラーにならない。
ディレクトリ = パッケージ
Rubyではファイル構造とモジュール/クラス構造が緩く連結(Railsのautoloadが処理)。Goではディレクトリ1つがパッケージ1つ。同じディレクトリの全.goファイルは同じpackage宣言を持たなければならない。
GOPATH → Go Modules
昔のGoはGOPATHという固定パスに全コードを置く必要があった。Rubyで言えば全プロジェクトを~/ruby_projects/内でのみ開発するようなもの。今はGo Modules(go.mod)のおかげでどこでも開発可能。Bundlerが解決した問題をGoは2019年にやっと解決した。
RubyからGoへ
Ruby: Gemfile + bundle install → Go: go.mod + go get
Ruby: require "json" → Go: import "encoding/json"(未使用時コンパイルエラー)
Ruby: RubyGems中央レジストリ → Go: GitHub URLがそのままパッケージ名
Ruby: ファイル/モジュール緩い連結(autoload)→ Go: ディレクトリ=パッケージ(1:1対応)
メリット
- ✓ パッケージダウンロードが速い — ソースを直接取得するのでビルドがシンプル
- ✓ 未使用importがコンパイルエラー — コードが常に綺麗に維持される
デメリット
- ✗ GitHub URLベースなのでリポジトリ削除/移動で依存性が壊れる
- ✗ プライベートリポジトリ依存性設定がRubyGemsに比べて面倒