DMM.go#10開催レポート

サムネイル

はじめに

こんにちは!

DMM.go 運営の國分竜二(@_ryuji_cre8ive)です。 普段は、オンラインサロン開発部のアーキテクトチームとして既存機能の改修や新しいアーキテクチャへのリプレースなどを行っています。

2025 年 5 月 15 日(木)、DMM 主催の Go 言語勉強会「DMM.go #10」を開催しました。 今回は「Go 言語の深掘り特集」をテーマに、標準ライブラリやプロポーザルなど、Go 言語の内部実装に焦点を当てた勉強会を行いました。

イベント詳細は、以下のリンクから確認できます。

dmm.connpass.com

www.youtube.com

当日の様子

会場の様子

登壇内容

いっぬ: 「encoding/json v2 を予習しよう!」

いっぬ(PF 開発本部 - 認可チーム)の LT での登壇です。
Go 1.23 で experiment に追加された encoding/json v2 のプロポーザル内容について詳しく解説していただきました。

主な内容

デザインの変更
v2 では、パッケージがjsonパッケージとjsontextパッケージの 2 つに分割されます。jsonパッケージが意味的機能を、jsontextパッケージが構文的機能を担当する設計になっています。

新機能の紹介

  • ストリーム API への対応(io.Reader を直接アンマーシャル可能)
  • オプションによる動作の変更
  • 新しい MarshalerV2/UnmarshalerV2 インターフェース
  • より効率的なメモリアロケーション

新しいフィールドタグ

  • inline: 型の埋め込みなしでインライン化が可能
  • unknown: 未知のフィールドをマッピングしてデータの欠落を防止
  • format: マーシャル時の値のフォーマットを指定

Go 本体にマージされる気運も高まっており、早めにキャッチアップしておく価値のある内容でした。

いっぬの登壇中の様子

speakerdeck.com

屋比久怜央: 「log, log/slog パッケージの深掘り」

屋比久怜央(マーケティングテクノロジー部)の LT での登壇です。
Go 1.21 で追加された構造化ロギングパッケージslogについて、その仕組みを詳しく解説していただきました。

主な内容

3 種類のハンドラー

  • デフォルトハンドラー: もっともシンプルな形式
  • テキストハンドラー: キーと値を明示的に表示
  • JSON ハンドラー: JSON 形式での出力

ゴルーチンセーフな実装
ログ出力時にロック機構を使用することで、複数のゴルーチンから同時にログを出力しても文字列が混在することなく、意図したとおりに出力される仕組みを実装。

バッファ管理と sync.Pool
小さなデータをまとめて出力する効率化と、sync.Pool を利用したバッファの再利用により、メモリアロケーションを削減してパフォーマンスを向上させています。

発表者が誕生日当日だったという微笑ましいエピソードもありました。

屋比久怜央の登壇中の様子

speakerdeck.com

菊地ひなた: 「意外と知らない cgo の世界」

菊地ひなた(データ基盤開発部 - ML 基盤チーム)の LT での登壇です。
機械学習フレームワークで使用されている cgo パッケージについて、その仕組みを詳しく解説していただきました。

主な内容

cgo の基本的な使い方

  1. Go から C の関数を呼び出す
  2. 事前定義された C 関数を呼び出す
  3. C から Go の関数を呼び出す

cgo のビルド過程
cgo のビルド時には以下の処理が行われています:

  1. C と Go の中間ファイル生成
  2. それぞれのコンパイル
  3. オブジェクトファイルとアーカイブファイルの作成
  4. 最終的なリンク処理

発表内では実際の Go ビルドの -x オプションを使用して、内部で行われている処理を詳細に追跡した内容を紹介していました。

最終的には、共有ライブラリを使用する場合も cgo でコンパイルする場合も、オブジェクトファイルをリンクして実行ファイルを作成するという基本的な仕組みは変わらないことが明らかになりました。

菊地ひなたの登壇中の様子

speakerdeck.com

松本響輝: 「sync/v2 プロポーザルの背景と sync.Pool について」

松本響輝(マーケティングテクノロジー部)の LT での登壇です。
sync/v2 プロポーザルと sync.Pool について、背景である技術的な課題と解決策を解説していただきました。

主な内容

sync v1 の課題
現在の sync パッケージはinterface{}(any)を使用しており、これによりメモリアロケーションが発生したり、型アサーションが必要になるといった問題があります。

sync/v2 プロポーザルの内容
sync.Pool と sync.Map をジェネリクス対応させることで、型安全性の向上とパフォーマンスの改善を図る提案です。

interface{}使用時のメモリアロケーション
インターフェースは型情報と値へのポインタを持つため、ヒープ領域への割り当てが発生します。ただし、ワードサイズ以下の値の場合は最適化により直接値が格納されます。

v2 パッケージを作ることの是非
ジェネリクス対応のためだけに v2 パッケージを作るべきかという議論も紹介され、今後の Go の進化における重要な判断となることが言及されました。

松本響輝の登壇中の様子

speakerdeck.com

懇親会

全発表の終了後には、軽食とドリンクを用意し、懇親会を開催しました。
懇親会では、参加者同士はもちろん、DMM 社員と参加者との交流が行われました。
特に今回は標準ライブラリの深掘りというテーマだったため、Go 言語の内部実装や今後の方向性について活発な議論が交わされました。

懇親会の様子

まとめ

集合写真

本記事では、2025 年 5 月 15 日(木)に開催された DMM.go #10 について紹介しました。
今回は「Go 言語の深掘り特集」をテーマとし、encoding/json v2、slog、cgo、sync/v2 プロポーザルという、Go 言語の標準ライブラリや将来の仕様に関する技術的に深い内容を取り扱いました。

どの発表も実装の詳細に踏み込んだ内容で、Go 言語をより深く理解するための貴重な知見を共有していただきました。

次回予告

次回の DMM.go #11 の詳細については、決定次第 connpass でお知らせいたします。

終わりに

DMM.com では、Go 言語を使って開発しているエンジニアを募集しています。
ご興味のある方は、以下の URL からご応募ください。

dmm-corp.com