ほぼ週間Go言語 2025/09/29
今週もプログラミング雑記からGo言語に関する話題と、その他特に気になった話題をより抜きでお送りします。
Go言語
Go 1.25に新しく追加された「フライトレコーダー」は、Goアプリケーションの診断に役立つ強力な機能です。従来の実行トレースは、goroutineの動作やシステム相互作用を詳細に記録できる反面、長期間稼働するWebサービスには膨大なデータが発生し、問題発生時に即座に記録開始できませんでした。フライトレコーダーは、数秒間のトレースをメモリに保持し、異常検知時に直前の実行状況だけをスナップショットとして保存できるため、問題発生の直前に何が起きていたか効果的に分析できます。例えばHTTPサーバの応答遅延の原因究明では、遅いリクエストが検知されたタイミングでトレースを保存し、「defer」によるロック解放遅延など細かな不具合を発見できました。トレースはGo標準の分析ツール「go tool trace」で可視化・調査でき、近年のGoリリースでは処理負荷の低減やフォーマットの改善も進んでいます。今後はプログラムによるトレース解析も提供予定で、Go診断機能はさらに進化が期待されています。
GoのHTTPサーバーでの「グレースフルシャットダウン」は、新規リクエストの受付を停止し、処理中のリクエスト完了後にリソースを適切に解放して停止する手法です。これによりデータ損失や取引の中断を防ぎ、ユーザー体験と信頼性を向上させます。Go標準パッケージで容易に実装できます。
Goの「黒魔術」(reflectやunsafeパッケージ、go:linkname等を用いて通常は不可能な処理を行う手法)は高い柔軟性やパフォーマンスを実現する一方、実装外部の仕様変更時などに重大な副作用やバグを引き起こす可能性があります。こうしたリスクに対して、コンパイルアサーション(型適合や配列長アサーション等)を使って異常を事前に検知し、安全性を担保しながら黒魔術を運用する方法が紹介されています。基本は安全第一で、本当に必要な場面にのみ慎重に活用すべき、という内容です。
Google Go Style Guideは公開後も継続的にアップデートされており、Protoのimport名や構造体フィールド記述の必須化、エラーのドキュメント化など複数の重要な変更が加えられている。内容の差分はGitHubで確認でき、チームや開発フェーズに合わせて活用すると良いと紹介している。
ライブラリなど
プログラムのリトライ、タイムアウトの処理などをラップしていい具合にしてくれるライブラリのようです。
vogteは、Goコードベース向けのエージェント型ターミナルUIです。LLM(GPT-4やClaude Sonnet等)と連携し、リポジトリ構造を解析・圧縮し、効率的な修正提案やパッチ適用を支援します。Goツールを活用した高速な検証や、設定不要の簡単利用も特徴です。
maniartech/signalsは、Go言語向けの依存なし高速イベントシステムライブラリです。pub-sub型で同期・非同期両方に対応し、ゼロアロケーション設計と高いスレッド安全性により、取引システムや制御系などリアルタイム処理に最適です。コンテキストやエラーにも対応し、使いやすく実用的です。
PatchLens/go-update-lensは、Go言語のモジュール依存関係のアップデート時に、挙動の変化を解析するツールです。モジュール更新による影響範囲を静的解析や実行監視で特定し、テスト実行前後のフィールド・動作変化やパフォーマンスの差分も検出します。さらにミューテーションテストによる信頼度評価と包括的なレポート(JSON/可視化チャート)生成により、リグレッションリスクや影響箇所を詳細に把握できます。ワークスペース(go.work)や単一・複数モジュール更新、設定の柔軟さにも対応しています。
Go言語でキャラクターベースの表を作成するためのライブラリ。
uuidv47は、uuidv7をuuid4風の表現に変換、逆変換するライブラリです。
そのGo言語のライブラリ
Go言語でのサンプル:
// UUID47を使用して、uuidv7をuuidv4風に変換し、また元に戻すサンプルコード
package main
import (
"fmt"
"github.com/google/uuid"
"github.com/n2p5/uuid47"
)
func main() {
// uuid v7を生成
u, err := uuid.NewV7()
if err != nil {
panic(err)
}
fmt.Printf("uuid v7: %s\n", u.String())
// 変換用キーを作成する
key := uuid47.Key{K0: 0x0123456789abcdef, K1: 0xfedcba9876543210}
// 乱数でキーを作成する場合には以下のようにする:
// key, _ := uuid47.NewRandomKey()
// uuid.UUIDをuuid47.UUIDに変換
var v7 uuid47.UUID
copy(v7[:], u[:])
// uuidv7をuuidv4風に変換して外部公開用にする
v4facade := uuid47.Encode(v7, key)
fmt.Printf("External ID(uuidv4): %s\n", v4facade)
// uuidv4風からuuidv7に戻す
original := uuid47.Decode(v4facade, key)
fmt.Printf("Internal ID(uuidv7): %s\n", original)
}
その他
本
カーニハンによるUnixの回顧録。
セキュリティ
2025年、元米政府高官たちが参加するSignalグループチャットに、誤ってジャーナリストが招待され、不適切な(軍事作戦に関する)情報が共有される「シグナルゲート」事件が発生。主導者Waltzは、政府で指定されている通信手段を使用していないばかりか、本物のSignalではなくTM SGNLという偽物アプリを使用しており、運営企業TeleMessageの脆弱サーバが二度ハッキングされ、何百GBもの民間・政府の平文メッセージが流出。TeleMessageがエンドツーエンド暗号化を偽装していた事実や、政府高官の脆弱なITリテラシー・隠蔽体質も暴露された。この事件は米国の情報管理の無能と危険性を浮き彫りにしている。
開発生産性に関する調査
調査によると、開発生産性を阻害する要因の上位3つは「不明確な要件」「会議が多い」「コミュニケーションの問題」であり、これらは技術的な課題ではなく、組織運営やプロセスに起因するものです。不明確な要件は、文書化・伝達不足、開発の本質的不確実性、価値・優先順位の曖昧さが背景にあります。特に「なぜ(Why)」を明確にすることが重要であり、ユーザーストーリーマッピングは、ユーザーの行動や目的、価値を時系列で可視化することで、関係者間の共通認識と合意形成を促進します。これにより、要件定義の質向上だけでなく、アウトカム志向の開発が実現します。加えて、会議やコミュニケーションの行き違いによる生産性低下も、目的や責任の明確化・ドキュメントの共有・適切な運営やツール活用で改善が期待できます。技術的改善だけでなく、組織的な仕組みの見直しが生産性向上の鍵となります。
開発手法
このセッションでは、公式スクラムガイドには載っていない、チームでスクラムをはじめる際に重要なポイントが紹介されています。スクラムは「始めるのは簡単だが、習得は難しい」とされ、形式的に進めることはできても、チームで価値を出すのは容易ではありません。スプリントゴールを運用し、集まって共同作業を重視し、スプリントレビューで妥協しない、スプリントレトロスペクティブの目的を明確にする、アジャイルコーチの活用、社内外コミュニティとのつながりなどが勘所として挙げられます。また、生成AIの台頭により開発やチーム編成も変化しており、スクラムもさらにアップデートが必要です。スクラムを実践する中で、課題に向き合い続けることで、よいチームを育て社会的価値につなげることが強調されています。
PostgresSQL
PostgreSQL 18が2025年9月25日にリリースされ、I/Oサブシステムの刷新によりストレージ読み込みで最大3倍のパフォーマンス向上を実現、より多くのクエリがインデックスを活用可能となりました。メジャーアップグレード後の統計情報保持や並列アップグレードなど、移行も高速化。仮想生成カラムやUUIDv7生成、OAuth 2.0認証対応など新機能も充実し、セキュリティ強化・開発体験向上・テキスト処理の最適化も図られています。詳細は公式リリースノートを参照してください。
Discussion