Go 1.22から標準ライブラリでより良いルーティング対応を提供
- 以前は手動でルーティングを処理していたが、今では
mux.HandleFunc を使って簡単にルーティング可能
- ログインミドルウェアを追加してセキュリティを強化可能
組み込みルーターの注意点: 末尾スラッシュによるリダイレクト
/records/ パスを作ると、/records へのリクエストは /records/ にリダイレクトされる
- これにより POST リクエストの本文が失われ、GET リクエストに変わってしまう問題が発生する可能性がある
- 解決策は、
POST /records/ の代わりに POST /records のような API エンドポイントを使うこと
sqlcでデータベースクエリコードを自動生成
- ORMを学ばなくても SQL クエリを書ける
sqlc ツールを発見
- SQL クエリを書くと Go コードに自動変換される
- ORM のドキュメントを参照しなくても必要な SQL クエリを簡単に書ける
sqlite最適化のヒント
- データベースに書き込み専用オブジェクトを使い、
db.SetMaxOpenConns(1) を設定
- 読み取り速度を上げるには、書き込み用と読み取り用で別々の DB オブジェクトを使う
- JOIN が不要な 2 つのテーブルは別々のデータベースに入れて独立して接続可能
Go 1.19のGCメモリ制限設定
- 256MB や 512MB のようにメモリが比較的少ない VM 上であらゆる Go プロジェクトを実行すると、アプリケーションが OOM で終了し続ける問題が発生
- ガベージコレクタのデフォルト設定により、現在のヒープサイズの 2 倍までメモリ割り当てを許可
- Go 1.19 では、アプリケーションが特定のメモリ使用量に達したら GC を実行するよう指示する方法が追加された
- GC メモリ制限を 250MB に設定したところ、OOM 終了の頻度が減少
export GOMEMLIMIT=250MiB
GoでWebサイトを作る理由
- 単一の静的バイナリでデプロイが簡単
- 本番環境で使える組み込みWebサーバーがあり、WSGI などを構成する必要がない
- Go のツールチェーンはインストールも利用も簡単
- HTTP レスポンスを返すのが簡単で、プロジェクトの保守がしやすい
- 標準ライブラリに
net/http が含まれているため、追加ライブラリなしでWebサイトを作れる
- システムレベルの作業も簡単に実行可能
- すべてがプロジェクトを簡単に扱えるように作られているように感じる
まだ解決できていない問題
- Go でまだあまりやっていないこと
- HTML テンプレートのレンダリング
- 実際のログインシステムの実装
- CSRF の実装
- 一般にセキュリティに敏感な機能をどう実装すればよいかよく分からないため、ログイン/CSRF などが必要なプロジェクトは始めていない
Goの新機能を見るのは楽しい
- この記事で言及した 2 つの Go 機能(
GOMEMLIMIT とルーティング)は、ここ数年で新たに追加されたもの
- 新しい Go バージョンのリリースノートにもっと注意を払うべきだと思う
2件のコメント
sqlc は本当に素晴らしいです
Hacker Newsのコメント
embedパッケージに触れられていないのが残念Contextを追加して、キャンセルできるようにするのがよいsqlcにはいくつかの大きな制限と細かな不便さがあるので、使う前に issue リストを確認したほうがよいGOMAXPROCSを適切に設定すべきGOMEMLIMITを使うと、GCについての心配を減らせるhtml/templateは癖が強く問題も多いため、使わないほうがよいTemplを好むmuxに慣れていたが、新しいリリース機能には注目していなかったnilの問題のせいで、簡単な作業でさえ複雑になるBEGIN CONCURRENTを使うことで並行性を改善できる