Go 1.22のHTTPルーティング改善について

自然言語でも日本語という母語があるように、プログラミングでも自分の母語と呼べる言語を持ちたいと考え、最近はGoを本腰入れて勉強しています。その中で HTTP サーバーを実装しようとした際、Gin・Echo・chi など多くの選択肢があり、どのフレームワーク(ライブラリ)を選ぶべきか迷いました。 そんな中、Go 1.22(2024年2月リリース)から標準ライブラリのhttp.ServeMuxが強化されたことを知りました。 この改善により、多くのケースでサードパーティのライブラリが不要になっています。 この記事では、Go 1.22で追加されたServeMuxの新機能について、実例を交えながら解説します。 これまでのServeMux(Go 1.21以前)の課題 Go 1.21以前のServeMuxには、以下のような制約がありました。 HTTPメソッドを指定できない // Go 1.21以前: HTTPメソッドの区別ができない mux := http.NewServeMux() mux.HandleFunc("/users", func(w http.ResponseWriter, r *http.Request) { // GET、POST、PUT、DELETEなど、すべてのHTTPメソッドがこのハンドラに来る // 自分でメソッドを判定する必要があった switch r.Method { case http.MethodGet: // GETの処理 case http.MethodPost: // POSTの処理 default: http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) } }) このように、メソッドごとに処理を分けたい場合は、自分でswitch文を書く必要がありました。 パスパラメータを扱えない // Go 1.21以前: パスパラメータが使えない // /users/123 のような動的なパスを扱うには、自分でパースが必要 mux.HandleFunc("/users/", func(w http.ResponseWriter, r *http.Request) { // URLからIDを手動で抽出する必要があった id := strings.TrimPrefix(r.URL.Path, "/users/") fmt.Fprintf(w, "User ID: %s", id) }) 完全一致が難しい // Go 1.21以前: /users にアクセスしたかったが、/users/ も /users/abc もマッチしてしまう mux.HandleFunc("/users", handler) // これは /users だけでなく /users/ にもマッチする こうした課題から、多くのプロジェクトでサードパーティのルーターライブラリが使われていました。 ...

December 29, 2025 · Ken Kato

Helmコマンド まとめ

HelmはKubernetes向けのパッケージマネージャーで、複雑なアプリケーションのデプロイを簡単にしてくれるツールです。 Helmコマンドをよく忘れてしまうので、基本的なコマンドを備忘録としてまとめました。 インストール方法 macOSの場合は以下のコマンドでインストールできます。 brew install helm リポジトリ管理 リポジトリの追加 # リポジトリを追加する helm repo add stable https://charts.helm.sh/stable helm repo add bitnami https://charts.bitnami.com/bitnami リポジトリの一覧表示 # 追加されているリポジトリを確認する helm repo list リポジトリの更新 # リポジトリのインデックスを更新する(新しいチャートバージョンを取得) helm repo update チャートの検索・確認 チャートの検索 # リポジトリからチャートを検索する helm search repo nginx helm search repo mysql チャート情報の表示 # チャートの詳細情報を表示する helm show chart bitnami/nginx helm show values bitnami/nginx リリース管理 インストール # チャートをインストールする helm install my-nginx bitnami/nginx # 名前空間を指定してインストール helm install my-nginx bitnami/nginx -n production --create-namespace # カスタム値でインストール helm install my-nginx bitnami/nginx --set service.type=LoadBalancer リリース一覧の表示 # インストール済みのリリースを表示する helm list # 全ての名前空間のリリースを表示する helm list -A # 特定の名前空間のリリースを表示する helm list -n production リリース情報の確認 # リリースの詳細情報を表示する helm get all my-nginx # リリースの設定値を表示する helm get values my-nginx # リリースの履歴を表示する helm history my-nginx アップグレード # リリースをアップグレードする helm upgrade my-nginx bitnami/nginx # 新しい値でアップグレード helm upgrade my-nginx bitnami/nginx --set image.tag=1.21.0 ロールバック # 前のバージョンにロールバックする helm rollback my-nginx # 特定のリビジョンにロールバックする helm rollback my-nginx 2 アンインストール # リリースを削除する helm uninstall my-nginx # 名前空間を指定して削除 helm uninstall my-nginx -n production 便利なオプション ドライラン 実際にはインストールせずに、何が実行されるかを確認できます。 ...

December 27, 2025 · Ken Kato

kubectlで全てのリソースをgetする方法

kubectl get allだとCustom Resourceが表示されないので、全てのリソースが表示できずに困りました。kubectl api-resourcesを使えば、Custom Resourceも含めてサポートされているAPIリソースを全て把握できるので、それを応用して全てのリソースを表示できるようになりました。 備忘録として雑に書いておきます。 全てのリソースを表示する 以下のコマンドで、特定のnamespaceに存在する、全てのリソース(Custom Resourceも含めて)を表示することができます。 kubectl get $(kubectl api-resources --verbs=list --namespaced -o name | grep -v "events" | tr '\n' ',' | sed 's/,$//') -n openebs 各コマンドの説明 kubectl api-resources --verbs=list --namespaced -o name kubectl api-resources: クラスター内の全てのKubernetesリソース種別を表示 --verbs=list: list操作が可能なものに絞る --namespaced: 名前空間に属するリソースに絞る (NamespaceやNodeなどのcluster-scopedリソースは除外) -o name: kubectlで直接使えるリソース名だけを出力 tr '\n' ',' 出力されたリソース名を、改行区切りからカンマ区切りに変換 sed 's/,$//' 末尾に付いてしまった余分なカンマを削除

August 11, 2025 · Ken Kato

kubectlとjqコマンドの便利な組み合わせ

jqコマンドとは、JSON形式のデータを処理・変換するためのコマンドです。 普段はkubectlやAWS CLIと組み合わせて使うことが多いのですが、使い方やオプションをきちんと調べたことがなかったため、本記事の執筆を機に改めておさらいしようと思います。 この記事では、知っておくと便利な関数やjqコマンドの実践的な組み合わせ例を紹介します。 インストール方法 macOSの場合は以下のコマンドでインストールできます。 brew install jq jqコマンドの関数 keys関数 これまではjq ','のように全階層をまとめて表示してキーを把握していましたが、keys関数を使うと一階層ずつキーを表示できます。 # labelのキーを取得する kubectl get pod my-pod -o json | jq '.metadata.labels | keys' select関数 select関数は条件にマッチした項目のみを抽出します。 # Running状態ではないPodの一覧を取得する kubectl get pods -A -o json | jq '.items[] | select(.status.phase != "Running") | .metadata.name' # 上記の応用として、namespace、Pod名、Podの状態も合わせて表示する kubectl get pods -A -o json | jq -r '.items[] | select(.status.phase != "Running") | "\(.metadata.namespace) \(.metadata.name) \(.status.phase)"' | column -t 2つ目のコマンドではいくつかのオプションや機能を使っているため、それらについて説明します。 -r: ダブルクォートを削除するオプション(デフォルトでは"が付いてくる) "\(filter)": 文字列の中で \(filter) を使うことで、抽出した値を文字列に埋め込める。これにより、複数の値を空白区切りで1行に表示できる columnt -t: columnコマンドの-tオプションを使うことで、区切り文字を基準に列を揃えて表形式で表示できます contains関数 contains関数は指定した文字列が含まれていればtrueを返します。 ...

August 10, 2025 · Ken Kato

ghqとpecoを使った効率的なリポジトリ管理

他の記事でも多数紹介されていますが、最近ghqとpecoを使ってみてとても便利だったので、自身のブログでも紹介します。 ghqコマンド git cloneで多くのリポジトリをcloneしてると、ホームディレクトリ直下に大量のディレクトリで散らかり、どこに何があるかわからなくなってしまいます。 ghqは、Gitリポジトリをあらかじめ決めたディレクトリにまとめて管理できる便利なツールです。 ー https://github.com/x-motemen/ghq インストール方法 # macOSの場合 brew install ghq 基本的な使い方 # リポジトリをクローンする ghq get username/repository # ローカルのリポジトリ一覧を表示 ghq list pecoコマンド pecoは、CLI上でインタラクティブにテキストを絞り込み・検索できるツールです。 https://github.com/peco/peco インストール方法 # macOSの場合 brew install peco 基本的な使い方 # ファイルを絞り込み選択 ls | peco # 履歴から絞り込み選択 history | peco # プロセスを絞り込み選択 ps aux | peco ghq + pecoの組み合わせ この2ツールを組み合わせることで、リポジトリの切り替えが格段に楽になります。 aliasの設定 以下のaliasを~/.bashrcや~/.zshrcに追加します: # リポジトリを選択してcdする alias ghqcd='cd "$(ghq list | peco)"' まとめ ghqとpecoを組み合わせることで、リポジトリの切り替えが格段に楽になりました。

June 4, 2025 · Ken Kato