24 ポイント 投稿者 GN⁺ 2024-09-30 | 2件のコメント | WhatsAppで共有

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件のコメント

 
secret3056 2024-09-30

sqlc は本当に素晴らしいです

 
GN⁺ 2024-09-30
Hacker Newsのコメント
  • Go言語は、プロジェクトに5日間取り組んでから2年間放置した後でも、問題なく再びコーディングできるようにしてくれる
  • Go言語は数年前から学び始めたが、大きく変わっていないため、長い時間が経っても依然として有用
  • Go言語のWeb開発記事で embed パッケージに触れられていないのが残念
    • 単一バイナリに静的リソースをバンドルできるのはとても便利
  • データベーストランザクションは失敗するよう設計されているので、常にリトライループを使うべき
    • トランザクションループに Context を追加して、キャンセルできるようにするのがよい
  • sqlc にはいくつかの大きな制限と細かな不便さがあるので、使う前に issue リストを確認したほうがよい
    • 動的クエリ、1対多の関係、埋め込みCTE、複合型などをサポートしていない
    • シンプルな要件には向いているが、複雑な作業には手動のアプローチを使う必要がある
  • Goをコンテナ内で実行する際は、CPUスロットリングを避けるために GOMAXPROCS を適切に設定すべき
  • GOMEMLIMIT を使うと、GCについての心配を減らせる
    • KubernetesやDockerを使うときは自動で設定できる
  • html/template は癖が強く問題も多いため、使わないほうがよい
    • 代わりに Templ を好む
  • ルーティングへの言及があったのはうれしい
    • 長い間 mux に慣れていたが、新しいリリース機能には注目していなかった
  • 新しい職場で1か月間Goを使ったが、嫌いだった
    • Goは過去20年間の言語開発から何も学んでいないように見える
    • nil の問題のせいで、簡単な作業でさえ複雑になる
  • SQLiteを使うときは、単一スレッドの書き込みプールと別の読み取りプールを使うのがよい
    • BEGIN CONCURRENT を使うことで並行性を改善できる
  • Goのシンプルさと、フレームワーク依存がない点が大好き
    • 標準ライブラリと実績のあるサードパーティライブラリだけでも素晴らしいものを作れる
    • WebアプリやCLIツールを作るときにGoは適している
    • 明示的なエラー処理が好き
    • Goの大ファン