Go Conference 2025 参加レポート
はじめに
こんにちは、やせです。
新卒で入社してから半年ほど業務でGoを触っており、知見を深めようと思い、今回初めてGo Conference に参加したので備忘録としてレポートを書いてみます!
公式のページはこちら↓
自分はDAY1の午後から参加したので、参加したセッションについて書いていきます。資料が公開されているものに関しては資料を添付しています。
(誤りがあればご指摘いただけると幸いです)
DAY1
Deep Dive Into testing/synctest
Go 1.25で正式にリリースされたtesting/synctestについてのセッション。並行処理+時間依存のテストを高速かつ安定して書けるようになったが、内部でどのような仕組みで動いているのかの解説もあり、おもしろかったです。実際に自分も時間依存のテストで、どのようにテストを書けばいいのか悩んでいたので、とても参考になりました。
パネルディスカッション: Goコミュニティ これまでとこれから
パネラー兼ファシリテーター
パネラー
日本におけるGo言語コミュニティの歩みを振り返り、未来を展望するパネルディスカッションです。世代や立場を超えた視点でコミュニティの魅力や課題、これからの可能性を語り合います。
経験と新しい挑戦が交差する場を通じて、Goコミュニティの多様な未来像を探ります。
パネルディスカッション形式で4名の方が前でGoコミュニティについて話し合うというセッションでした。
自分と近い年齢の方が、Goコミュニティの魅力や立ち上げ初期の悩みなどを熱く語っていたのがとても印象的で、海外に行ったことが無い人をGoをきっかけに海外へ背中を押したり、地方で自分でコミュニティを立ち上げたりと、すごく素敵なお話を聞くことができました。
encoding/json/v2で何が変わる? - v1からv2への変化を徹底比較
Go 1.25で正式にリリースされたencoding/json/v2についてのセッション。
「変わるもの」「変わらないもの」「新しく追加されるもの」を中心に説明していました。実際に移行検証を行っていたので、自分でも実際に移行する際に参考になりそう~と思いました。あとv2が5年もかけて作られたというのが印象的でした。
Go で WebAssembly を利用した実用的なプラグインシステムの構築方法
GoでWebAssemblyを利用したプラグインシステムを1年半以上本番環境で運用した経験から得た知見をもとに、プラグインシステムの構築方法を説明していました。自分はまだWASMを触ったことがなかったので、正直あまり理解しきれない部分が多かったですが、WASMってこんなことができるんだ!と思いながら聞いていました。
全てGoで作るP2P対戦ゲーム入門
フロントからバックエンドまで全てGoで作るP2Pゲームで、フロントもGoで作れるんだ!となりました。画面描画に関してはEbitengineというライブラリが使われているらしく、そんなこともGoでできるのか、と思いました。フルスタックGoの時代が来るかもですね(?)
ちなみにEbitengine作者の方もGoconに来ていたらしいです笑
analysis パッケージの仕組みの上でMulti linter with configを実現する
実際にスピーカーの方がOSSとして公開しているgostyleというツールを深堀するというセッションでした。Goの汎用性の高いカスタムリンターを作る例としてとても参考になる内容でした。
DAY2
Goに育てられ開発者向けセキュリティ事業を立ち上げた僕が今向き合う、AI × セキュリティの最前線
メルカリ社でインターンするなど、自分は「Goに育てられたエンジニア」として学生起業に至り、今は開発組織のセキュリティを支える事業に注力しています。本セッションでは、自身の開発バックグラウンドと世界トップクラスの実力を持つセキュリティエンジニア達の能力を活かしてGMO Flatt Securityが現代の開発組織が抱える課題にどうアプローチしているか、AI × セキュリティの最前線も交え解説します。加えて、OSSやスタートアップの無料セキュリティ支援という形で現在実施しているコミュニティ還元に込めた思いもお話しします。
TAKUMIという脆弱性診断がツールすげー!となってました。あと昔はパッケージマネージャーはgo mod 以外もあったという昔ばなしを聞いてほえーとなっていました。
Goで体感するMultipath TCP ― Go 1.24 時代の MPTCP Listener を理解する
MPTCPというTCPの拡張プロトコルについてのセッションでした。自分はあまりネットワーク知識が無いため難しかったですが、こんなのがあるんだ~と勉強になりました。
私達はmodernize packageに夢を見るか feat. go/analysis, go/ast
goplsに搭載されているmodernize packageの説明や、Goの最新の記法を安全に導入するためのセッションでした。内部実装を読み解きながら、どのように導入していくのかを説明していたので、とても参考になりました。
Go1.24時代のユニットテスト品質向上
本セッションでは、ユニットテストの品質向上のため、Go 1.24 で導入された (*testing.T).Context() とモック生成ライブラリ uber-go/mock を組み合わせたユニットテストの設計手法を解説します。
実際にチーム内でテストのカバレッジが低いという課題に対して、 (*testing.T).Context() とモック生成ライブラリ uber-go/mockを使用したアプローチやチームでの文化形成について説明していました。テスト文化の無いチームに文化を形成してくのって技術的に変更するだけではなく、チームメンバーの意識も変える必要があるという点で、すごく大変だと思いますが、叩き台を作るなどして少しずつ変えていっててすごいな~と思いました。
カリカリなMutexを作る / "Crispifying" Go's Mutex
GoのMutexについて深堀するというセッションでした。途中から付いていけなかったですが、GoのMutexの内部実装を読み解きながら、どのようにカリカリなMutexを作るのかを説明しており、Mutexの中でこんなことが起きてるんだ~とざっくり理解(?)できました。
メガエンプラSaaSを支えるシリーズAスタートアップのGoアーキテクチャ
災害をメールで通知するというシステムにおいて、どのようなアーキテクチャを採用し、整合性を担保しているのかというお話でした。信頼性の高いシステムを作るための工夫がなされており、参考になりました。
panicと向き合うGo開発 - nilawayで探る見逃されるnil参照とその対策
nil参照によるpanicの発生をuber-go/nilawayによる静的解析で防ごうというセッションでした。数学的な説明も交えて、どのようにしてパッケージを跨いだnil参照を検知するのかの仕組みを説明しており、こんな風にnil参照を検知できるんだ~と勉強になりました。
なぜGoのジェネリクスはこの形なのか? - Featherweight Goが明かす設計の核心
ジェネリクスがなぜ現在の仕様になったのかを説明するセッションでした。Featherweight Goという論文をもとに、ジェネリクスが現在の仕様になるまでの流れを説明していました。Featherweight Goという名前は、Featherweight JavaというJavaの論文にインスパイアを受けたらしいです。
Green Tea Garbage Collector の今:Go言語のコアチームによる試行錯誤の過程と共にメモリ管理最適化の実装を読み解く
Green Tea Garbage CollectorというGo言語の新しいGCアルゴリズムについて説明するセッションでした。現代のCPUやメモリのトレンドの変化も交えて、過去・現代・未来におけるGCアルゴリズムについて説明しており、普段なかなか聞くことのできない話を聞くことができて面白かったです。
コード生成なしでモック処理を実現!ovechkin-dm/mockioで学ぶメタプログラミング
個人的に1番面白いな~と思ったセッションです。(スライドが力作ですが、時間の都合上セッション自体はめっちゃスキップされてました)
ovechkin-dm/mockioを使用してランタイムでモック処理を実現できるのですが、内部で使用されているovechkin-dm/go-dynoというライブラリがどのように動的なメソッドの生成を実現しているのか、というお話です。メソッドの動的振る舞い変更を実現するためにunsafe.Pointerを使用してメモリをハックするという力技が使われていて面白かったです。
10年もののAPIサーバーにおけるCI/CDの改善の奮闘
10年もののAPIサーバーのCI/CDを16→10分に改善したというお話でした。デッドコードの削除やテストの並列化、差分テスト、キャッシュなどを使用してCI/CD時間を改善していった過程が説明されていました。1万行のデッドコードを削除しても変化が無かったのが意外でした。
goplsの拡張によるマイクロサービス間の実装ジャンプ改善
WINTICKETでは、モノレポ環境下でgRPCを用いたマイクロサービスの開発を行っています。機能開発時には、複数のマイクロサービスの実装を修正することがありますが、あるサービスから呼び出したRPCの実装を定義ジャンプで確認しようとしても、実際には自動生成されたinterface定義に飛んでしまい、目的の実装に直接ジャンプできないという課題がありました。そのため、毎回手動で実装を探しに行く必要があり、開発体験が良くありませんでした。 そこで、Go言語のLanguage Serverであるgoplsを拡張し、RPCのinterfaceではなく実装へジャンプできる新しい定義ジャンプ機能を実装しました。これにより開発体験が大きく向上しました。 このセッションでは、具体的なgoplsの拡張方法と、実際にWINTICKETで行っているVS Code拡張機能を活用した運用方法についてお話しします。
gRPCで通信しているマイクロサービス間の実装ジャンプを、goplsを拡張して実装するというセッションでした。現在のフォルダ構成をもとにパスを構築し、LSPを使用して実装ジャンプを実現するという方法が紹介されていました。運用では、golpsをすべて上書きするのではなく、一部を上書きすることで、通常の実装ジャンプとgRPCの実装ジャンプの両方を使えるようにしていました。
LT
uniqueパッケージの内部実装を支えるweak pointerの話
Go1.24で追加されたweak pointer(弱参照)は、ガベージコレクタ(GC)と連携して、これまでよりも柔軟なリソース管理を可能にする仕組みです。本LTでは、uniqueパッケージの内部実装を題材に、weak pointerの基本や強いポインタとの違い、そしてなぜGoにこの仕組みが導入されたのかを見ていきます。
uniqueパッケージは「値が等しければ同じポインタで表現する」という一意化を実現するために、内部でweak pointerを活用しています。これにより、使われなくなった値が自動的にGCで回収されるなど、Goらしいシンプルさと効率性が両立されています。
uniqueパッケージの中でweak pointerがどのように使われているのか、実際のコード例を交えながら紹介します。
weak pointerについてのLTでした。weak pointerについて完全に理解できました(?)
Go 1.24の新機能:tool directivesでツールの環境構築の効率性・再現性を高める
Go 1.24では、新たに「Tool Directive」の機能が導入され、go.modを活用して開発ツールを効率的に管理できるようになりました。この機能により、プロジェクトで使用するツール(例: stringer や特定のリントツール、フォーマッタなど)を明示的に依存関係として記録し、プロジェクトごとに一貫したツール環境を構築することが可能です。
本セッションを通じて、参加者の皆さんがGo 1.24で導入されたTool Directiveの概要を理解し、すぐに実践できる状態になることを目指します。この機能を活用することで、Goプロジェクトのツール管理がさらにシンプルで強力になることを覚えていただけたらと思います。
Go 1.24で追加されたTool DirectiveについてのLT。めっちゃ便利そうなので自分のチームでも導入してみたい!
それでも私は Contextに値を詰めたい
Goの context.Context は主にキャンセルやタイムアウトの伝播のために使われる仕組みですが、Value にメタデータをもたせる機能も備えているのは周知のとおりです。
Goでは一連の処理完了後に Context のValueに含まれる情報を用いて実行結果ログ、リクエストログを出力する実装パターンがあります。
が、設計パターンや利用ライブラリによっては上手く Context に値を含められないシーンも存在します。
この発表では、現場でよく詰まる次のような場面でどのように Context に値を含められるかをメリット・デメリットと合わせて紹介し明日のPRに活かせるTipsをまとめます。
- Context 非対応なAPIシグネチャをもつライブラリを利用しているとき
- コアロジックの中から Context に値を渡して呼び出し元に値を返したいとき
聞くと得られること
- Context Valueの設計をチームで議論する際の判断軸
- 非対応ライブラリでもリクエストID等を持ち回す実装ヒント
子→親へどうやってコンテキスト経由で値を渡すのか?という課題に対してデコレーターパターンとポインタを詰める方法が紹介されていました。メリデメありそうなので使いどころを見極めないといけなさそうですね。
math/rand/v2への移行と実践
Go 1.22で導入された
math/rand/v2
はmath/rand
の根深い課題を解決する待望の機能でした。また、encoding/json/v2
やsync/v2
をはじめとした他の標準パッケージでもv2を追加する動きが出てきています。
本セッションでは、旧来のmath/rand
が抱えていた性能やAPIをはじめとした問題点を振り返り、rand.Seed()
の非推奨化、新たな乱数生成アルゴリズム、性能改善など、v2でどう解決されたのかを実際のコード例などを踏まえて説明します。
math/rand/v2でどのようにmath/randの課題が解決されたのかを説明していました。encoding/jsonに続くv2セッション!
Flaky Testへの現実解をGoのプロポーザルから考える
GoでのFlaky Test対策について説明されていました。Go本体にもFlaky Testが存在するというのが意外でした。
defer f()とdefer fの挙動を誤解していた話
defer f()とdefer fの挙動の違いについて説明していました。自分も誤解していたので勉強になりました!関数の引数はdeferでも即時評価されるんですね~
TinyGo Keeb Tour から始まる OSS 初コントリビュートの物語
はんだ付けとコーディング (TinyGo) を通じて自作キーボードを作るイベントをきっかけにOSSへ初コントリビュートしたというお話でした。なかなか最初の一歩は踏み出せないと思うのですが、こういったサポートがあると初めての方は踏み出しやすそう!
Pure Goで体験するWasmの未来
TinyGoを使わずに「気合」でWASI 0.2を使うというお話でした。気合で動くようになるらしいです笑
気合↓
その他公開資料
サプライチェーン攻撃に学ぶmoduleの仕組みとセキュリティ対策
Goで実現するgraceful shutdown: 実運用での課題と解決策
†開発を加速させる黒魔術講座†
今日から始めるpprof
TinyGo Keeb Workshop
作って理解するGOCACHEPROG
さいごに
初めてのカンファレンス参加でしたが、すごく刺激をもらえる2日間でした!
関係者各位の皆様、素敵なイベントをありがとうございました!
素敵なノベルティも頂きました!
appendix
企業ブースで色んなゲームを楽しんでいました
Discussion