書籍『Go言語による分散サービス』の学習記録第2章。ログレコードのスキーマをProtocol Buffersで定義し、protocとGo向けプラグインでコードを生成する手順を解説。.protoファイルの構文(syntax、package、go_package、フィールド番号)、Makefileによるコード生成コマンド、生成されたGoコードの構造、proto.Marshal/Unmarshalによるバイト列とのシリアライズ変換を実例付きで示す。
著者がGoでリアルタイム通信サーバーの仕組みを学べる技術書典21向けの新刊を紹介する記事。ターミナルで動く対戦シューティングゲームを題材に、TCP上に独自プロトコルを設計しProtocol Buffersでメッセージをやり取りする通信基盤と、サーバー主導・クライアント起点双方の状態同期を、5章構成のハンズオン形式でゼロから実装する内容。オンライン開催は11/21〜12/6、オフラインは11/23に池袋サンシャインシティで頒布予定。
Go連載#19。channelによるgoroutine間の値受け渡しと完了待ちを解説。バッファなしchannelの手渡し的挙動とdeadlock、close+for rangeでの終了通知、select+ctx.Done()によるタイムアウト処理、worker poolによる同時実行数制御を実装例付きで説明し、Mutexとchannelの使い分け指針も提示している。
『Go言語による分散サービス』第1章のハンズオン記録。追記専用ログをGoで実装し、JSONを受け取るHTTP APIを用意、複数リクエストから安全にログを読み書きする仕組みを作成。データはメモリのみで永続化前の最小構成。
GoでWebページのtitle・description・canonicalを取得するCLIを作る記事。context.WithTimeoutとhttp.Clientの二重タイムアウト、レスポンスサイズ上限、Content-Type確認、文字コード変換、HTML tokenizerによる解析、相対canonicalの絶対URL解決、リダイレクト回数制限などを実装しながら解説している。複数URL検査への拡張やSSRF対策にも言及。
Go言語の並行処理入門記事。goroutineの基本動作(goキーワードでの起動、mainが終了すると未完了goroutineも消える性質)から始め、sync.WaitGroupによる完了待機、データ競合の実例(1000回加算が986等になる現象)と-raceフラグでの検出、sync.Mutexによる修正方法を解説。さらにnet/httpが1リクエスト1goroutineで動作している事実を実測で示し、handlerが同時に呼ばれる前提で共有状態を持たない設計が必要であることを説明する実践的なGo学習連載記事。
BacklogのGit機能マイクロサービスにOrchestrionでDatadog APM自動計装を導入した際、net/httpとgorilla/muxの二重計装によるスパン重複と、gRPC StreamClientInterceptorが別goroutineでFinish()を呼ぶことによるGLS(goroutine-local storage)リークが原因で、無関係なリクエストのトレースがkeep-aliveコネクション上で数珠つなぎに混在する問題が発生した。gRPC integrationを無効化し手動計装に切り替えることで解消し、再発防止のためlintで禁止importを機械的に検出する仕組みも整備した。
Go の context を使い、DBクエリのタイムアウトとクライアント切断のキャンセルをhandler/usecase/repositoryの3層に貫通させる方法を実験付きで解説。context なしでは接続断後もDBがクエリを実行し続けること、WithTimeoutでの期限管理、ctx.Err()による確実なタイムアウト判定、504返却の実装例までを扱う実践的なGo学習記事。
Go 1.27がリリースされ、ジェネリックメソッドのサポート、構造体リテラルでのフィールドセレクタキー、関数型推論の拡張など言語仕様が強化された。ツール面ではgo fixの新モダナイザ追加やgo mod tidyの改善、ランタイムでは小オブジェクト割り当ての高速化とgoroutineleakプロファイルの一般提供、標準ライブラリではencoding/json/v2やcrypto/mldsa(耐量子署名)、uuid、simdパッケージなどが追加された。
JetBrains公開のgo-modern-guidelinesリポジトリを読み解いた記事。Go1.27対応のジェネリクスメソッド・json/v2・stdlib uuid等に加え、slices/maps/strings/bytes/sync/context/errorsパッケージのイテレータやユーティリティ関数を使った簡潔な書き方を多数紹介し、それぞれbefore/after形式でまとめている。coding agent向けのガイドラインだが人間の学習にも有用と評価している。
学生がDMM Sprint Go(Go言語のバックエンド開発を学ぶ5日間のインターン)に参加した体験記。AIを使わずにYatterというSNSアプリのバックエンド実装に取り組み、オニオンアーキテクチャやcontextの扱い、CQRS等の設計判断を講師と議論しながら学んだ様子や、対面でのチーム開発・交流会を通じた学びが語られている。
Goでレイヤードアーキテクチャを実践する連載の第16回。usecase層とhandler層を分離し、業務判断(入力検証・重複チェック)をusecaseに集約、handlerをHTTP翻訳役に専念させる。DI(依存性の注入)とGoのinterfaceの暗黙的実装を使い、main.goを配線専用にする設計を解説。偽物のrepositoryをinterface経由で注入することで、DBなしで業務ルールの単体テストが0.002秒で実行できることを実演し、テスト容易性をアーキテクチャで作り込む考え方を示す。
Go 1.24〜1.26でsync.Mapの内部実装がハッシュトライ(HashTrieMap)に変更された経緯を解説する記事。通常のmapがなぜ並行アクセスに安全でないかから説き起こし、mutex付きmapとsync.Mapの使い分け、sync.MapのAPIと注意点(Lenが無い・Rangeがスナップショットでない・ClearとStoreの競合でStoreが失われうる・メモリ使用量が3〜5倍多いこと)を示した上で、ジェネリクス以前に作られたsync.Mapがany型を使わざるを得ない理由と、内部でハッシュを4bitずつのグループに分けてトライ木を辿る仕組み(indirect node/entry nodeによる衝突解決)を詳細に説明している。
Microsoft Agent Framework for Go(public preview)の採用可否を判断する記事。APIの有無だけで判断せず、Provider認証、tool呼び出し、workflowの正常/異常終了、観測性(trace/ログ)、更新後の互換性テストという運用に必要な流れを実機検証すべきと説く。既存サービスがGoで動いているなら実行環境統一のメリットがあるが、Python/.NET限定機能が中心なら採用理由は弱いと整理し、コミットSHA固定や検証記録の残し方も提示している。
ABEMAの広告配信システムでGo 1.27へのCIアップデートを検証した事例。ほとんどのCIは互換性を保って通過したが、protobufの自動生成コード差分チェックのみ失敗した。原因はcompress/flateの圧縮アルゴリズム変更によりgzip圧縮結果のバイト列が変わったこと。旧世代のprotobuf generatorはgzip済みdescriptorを生成コードに埋め込むため影響を受けるが、現行世代はruntime側でgzipするため影響を受けない。go.modのgo directiveとtoolchainのバージョンは独立しており、toolchainが新しければgo.mod側が古くても生成物が変わりうる点も指摘している。