Go Conference 2025 参加レポート - Go言語の最新トレンドを体感してきた2日間
はじめに
2025年9月27日と28日の2日間、東京・渋谷のAbema Towersで開催されたGo Conference 2025に参加してきました!
SODAはシルバースポンサーとして、協賛しているので、ブース出展のメンバーが入場できるのですが、
そのメンバーは2名のみ入場できるとのことなので、お手伝いとして入場するkazuと22skyyは一般のチケットで入場することになりました!
スポンサーとしての出展についてはこちらの記事で書かれているので、
今回は、kazuと22skyyの二人がスポンサーブースのお手伝いの合間に参加してきたワークショップとセッションについて、書いていこうと思います!
また、弊社のmagavelがLTで登壇しているのでこちらの記事も見てみてください!
Go Conference 2025の概要
基本情報
- 開催日: 2025年9月27日(土)・28日(日)
 - 会場: Abema Towers 10F / 11F(東京都渋谷区宇田川町40-1)
 - 参加費: 一般 ¥5,000(税込)/ 学生 ¥1,000(税込)
 
Go conference 2025は2日間で開催されました!
場所は去年と同じAbema Towersで開催されました!
去年は無料で開催されていたのですが、今年は参加費が¥5,000(税込で学生 ¥1,000(税込)となりました。
去年同様チケットはすぐに売り切れてしまいましたので、チケット発売同時に購入しておいて良かったです!
10階でセッションや、ワークショップなどを行い、11階ではスポンサーのブースが展示されていました!
1日目
Go1.24で進化したmap型について理解する
Go 1.24でmapがSwiss Table実装に変更され、探索はDirectory → Table → Group → Slotの4段階になるとのことでした。
Tableはハッシュとディレクトリ長の組み合わせで選択され、Extendible hashingによってリハッシュの影響を局所化していました。
Groupでは上位57bit(H1)とQuadratic probingを用いてクラスタリングを抑制し、Slotでは下位7bit(H2)とcontrol wordを使って8スロットを一括でチェックしていました。
この仕組みにより、キャッシュ効率が向上し、探索が短縮されることで全体的なパフォーマンスが向上するとのことでした。
サプライチェーン攻撃に学ぶmoduleの仕組みとセキュリティ対策
2025年2月の事例を題材に、Go Modulesの守備範囲と限界を整理したセッションでした。Module Proxyは不変キャッシュとして機能するため、一度登録されたパッケージは後からすり替えることができませんでした。ただし、最初から悪意を持って登録されたパッケージについては、go.sumやChecksum DBでも防ぐことができないという限界がありました。また、MVSは別モジュールとして登録されたタイポスクワット攻撃には効果がありませんでした。最低限の対策として、正しいパッケージ名の確認、go.sumの維持、そして社内プロキシでの検証が重要とのことでした。
今日から始める pprof
pprofの入門ハンズオンで、採って→見る→直す→また採る、の一連を体験できるワークショップでした。
pprofにはruntime/pprof(CLI系)とnet/http/pprof(サーバ系)の2種類があり、用途に応じて使い分けることができました。go tool pprof -http :9999 cpu.profを実行することで、FlameGraph、Top、Graph、Sourceなどの可視化された情報を確認できました。
分析時にはFlatが高い場合はアルゴリズム側に、Cumが高い場合は呼び出し側に問題がある可能性が高いとのことでした。
差分を取りたい場合は-baseオプションを使用し、本番環境では継続プロファイリングツール(Pyroscope等)の利用が推奨されるとのことです!
analysis 上で Multi linter with config を実現する
go/analysisで設定ファイル付きの統合Linterを自作する話で、実例としてgostyleが紹介されました。
複数のAnalyzerを束ねて設定や結果を共有することで、ルールのON/OFFや閾値変更を一括管理できるとのことでした。
unitcheckerを使えばgo vetと連携でき、multicheckerを使えば単体のCLIツールとしても動作させることが可能とのことでした。また、//nostyle:xxxのような行単位での無効化機能は、commentパッケージを使って実装されていました。
2日目
Swiss Table の実装に Deep Dive !
GoのSwiss Table実装をアルゴリズム & ランタイム視点で徹底分解したセッションでした。
h1(57bit)とh2(7bit)を使ってGroupからSlotへと一気に絞り込みを行っていました。8スロットの同時判定にはbit hackが用いられており、比較回数を大幅に削減していました。
Extendible hashingによってgrowやsplitの影響を局所化し、small最適化やイテレーション中の変更にも破綻しない堅牢な実装となっていました。
After go func(): Goroutines Through a Beginner's Eye
goroutineとスケジューラ(M:N、Work Stealing、プリエンプション)を絵で理解するセッションでした。
Gは軽量で伸縮可能なstackを持ち、並列数はP(GOMAXPROCS)によって決定されるとのことでした。
空いたPは他のPからgoroutineを盗むWork Stealingという仕組みで効率的に動作していました。
Go 1.14以降では非協調プリエンプションが導入され、CPUを占有し続ける問題が抑止されるようになったとのことでした。
実際の動作はruntime/traceを使って可視化しながら設計を改善していくことが重要とのことでした。
Green Tea Garbage Collector の今(途中まで)
Go 1.25実験機能のGreen Tea GCについてのセッションで、スパン単位で局所性を上げてスキャンを速くする仕組みが紹介されました。
Green Tea GCは小さなオブジェクトが多いケースで効果を発揮し、work stealingによって並列スキャンを実現していました。
メタデータをオブジェクトと同居させることでキャッシュヒット率が向上し、GCのCPU使用率が約22%削減されるケースもあるとのことでした(ワークロードによって異なります)。
ただし、p99レイテンシは伸びることもあるため、平均値は改善されますがテールレイテンシには注意が必要とのことでした。
コード生成なしでモック処理を実現! mockio で学ぶメタプログラミング
コード生成なしでモックを実現するセッションで、内部でgo-dynoがメソッドを実行時に差し替えるという実装が紹介されました。
StructOfを使って実行時に構造体を生成し、埋め込みによってインターフェースを満たすようにしていました。
メソッドテーブルを書き換えてMakeFuncにつなげるという、unsafeやアセンブリを駆使した実装になっていました。
引数はABIハックによって共有され、When(...).Return(...)という記法が型安全に動作する仕組みが実現されていました。
goplsの拡張によるマイクロサービス間の実装ジャンプ改善
gRPCの実装本体にジャンプしたい問題を、gopls拡張とVSCodeコマンドで解決した事例でした。
通常の定義ジャンプはインターフェースまでしか辿れませんが、この拡張ではprotoファイルを検知してpkg配下を検索し、実装まで到達できるようになっていました。
既存のGo to Definition機能は温存しつつ、別コマンドとして共存させる形で運用されていました。
配布方法としては、個人のforkをサブモジュールとして利用するという現実的なアプローチが取られていました。
LT
それでも私は Context に値を詰めたい
原則として、WithValueは子から親に届かないので、
どうしても共有したいなら デコレータ(親から"箱"を渡す)から渡すようにするかポインタ格納(同じ実体を参照)するようにすると良いとのことでした。
math/rand/v2 への移行と実践
グローバル状態を排し並列セーフにする内容でした。移行はseedと生成器の扱いを決めるのが肝とのことでした。
Flaky Testへの現実解をGoのプロポーザルから考える
公式ではtestenv.SkipFlaky、t.Attr / testing/synctestなどで対応されていましたが、
運用のベストプラクティスとしては明示マーキング → 失敗時のみ再実行 + gotestsumという形で対応されているとのことでした。
defer f() と defer f の挙動を誤解していた話
deferで勘違いしていたことを供してもらうLTでした!
引数はその場で評価されるので、defer f()は"結果を登録"、defer fは"呼び出しを登録"という違いがありました。
実行順序はLIFO(Last In, First Out)でした。
TinyGo Keeb Tour から始まる OSS 初コントリビュートの物語
TinyGo×自作Keebきっかけで初OSS貢献までのリアルな話でした。良いモチベ供給になりました。
Pure Go で体験するWasm の未来
WASI(0.2)でネットワーク等も視野に入っているとのことでした。
GOOS=wasip1 GOARCH=wasmでビルドし、OCIレジストリ配布も行けるとのことでした。
現状はTinyGo先行で、AdapterでGoも頑張れば動くとのことでした。
Go1.25新機能 testing/synctest で高速&確実な並列テストを実現する方法
テストコード内でtime.Sleepを用いて非同期でテストを行わないといけない場合に有用なtesting/synctestというpackageが追加されたとのことでした。
testing/synctestを使うことで、time.Sleepを使った非同期テストの実行時間を大幅に短縮できるとのことでした。
使用方法や注意点についてはパッケージのドキュメントで詳しく学ぶことができました。
これにより、CI/CDパイプラインで時間がかかっていた原因を解消できる可能性があるとのことでした。
Goのビルドシステムの変遷
Goのbuildシステムの歴史を知ることのできるセッションでした。
Goのビルドシステムは、最初はMakefileのみを使用していた時代から、GOPATH配下でのみビルドが可能だった時代を経て、go moduleの登場へと進化してきたとのことでした。
途中でさまざまなビルドマネージャーが登場しましたが、Go開発コミュニティがこれらの課題を解消するためにgo moduleを開発したとのことでした。
現在ではどのディレクトリからでもビルドできるようになっており、その歴史的な変遷が興味深い内容でした。
panicと向き合うGo開発 - nilawayで探る見逃されるnil参照とその対策
現在のGoではポインタ型の変数・フィールドがnilのときにコンパイルエラーを解析するシステムは存在しないため、静的解析でnil panicを避けるセッションでした。
リポジトリ全体の完全な解析は現実的には不可能ですが、見逃される可能性のあるnil参照を検出できるパッケージとしてnilawayというものがあり、
これを使用することである程度のnil panicを避けることができるとのことでした。
まとめ
Go Conference 2025では、Go言語の最新トレンドや実践的な技術について学ぶことができました!
ワークショップがあったことと、初日であることからか、1日目のほうが参加者も多かった印象です!
しかし、2日目も様々なセッションがあり、とても勉強になる部分が多かったです!
株式会社SODAの開発組織がお届けするZenn Publicationです。 是非Entrance Bookもご覧ください! → recruit.soda-inc.jp/engineer
Discussion