【Go Conference 2025】参加レポート - Day 1

こんにちは、BBSakura Networksの外山です。

本日から2日間で開催されているGo Conference 2025(以下GoCon)に、普段からGo言語で開発をしているBBSakuraのエンジニア6名が参加しています!

今年度のGoConでは、BBSakuraはブロンズスポンサーをしており、2日目には早坂(@takemioIO)が「Goで体感するMultipath TCP ― Go 1.24 時代の MPTCP Listener を理解する」というテーマで登壇します。

blog.bbsakura.net

本ブログでも、BBSakuraの若手メンバーを中心に2日間に渡って、セッションやワークショップでの学びや会場の様子を即日レポートします。

会場内のGo Conference看板

⁠印象に残ったセッション

Go1.24で進化したmap型について理解する

Go1.24で進化したmap型について理解する のセッションをみました。 内容は1.24 Runtimeにあるbuiltin mapをSwiss Table ベースの実装に置き換わった性能改善についてでした。 Swiss Tableによる map実装の階層構造の紹介と階層上位オブジェクトから下位オブジェクトを探索する処理の説明をしていました。 それぞれのアルゴリズムによる改善ポイントを列挙してくれていて、その場で分からなくても調べやすくて助かります。

Swiss Table版の map の内部は Directory, Table, Group, Slots という4階層で構成されています。

  • TableSwiss TableGroup, Slot で構成されている
  • mapExtendible hashing によって Directoryを経由してTable を引き当ている

Swiss TableQuadratic probing, Control word など仕掛けが多く SIMD 命令も活用しやすく面白いかったです。 ただ自分はリハッシュのコストを下げるために採用された Extendible hashing に興味を持ちました。利用する tophash を階層化してリハッシュ範囲を狭めているのは面白かったです。 実装詳細はソースコードblogを当たると良いのです。

最近のリリースノートのRuntimeはGCを中心にメモリ管理の話が多く、あとは panic の扱いやトレースの問題が多い印象でした。 1.24ではマップの性能改善が入っています。頻繁に利用されるmapのデータ構造が差し替えられバージョンアップするだけで性能改善のはありがたいですね。

久しぶりに Go Conference 2025 に参加しました。単なるキャッチアップではなく調べにいくきっかけになるのでよかったです。(金井)

サプライチェーン攻撃に学ぶmoduleの仕組みとセキュリティ対策

このセッションでは、2025年2月に判明したGo言語モジュールのサプライチェーン攻撃の事例を基に、Go Moduleの管理とセキュリティの仕組みが紹介されました。

今回の事例では、タイポスクワッティングと、Go Moduleの不変性の悪用を組み合わせた巧妙な手口となっていました。 具体的には、

  1. github.com/boltdb/bolt に対して名前を似せたgithub.com/boltdb-go/boltという悪意のあるパッケージを準備
  2. それが最初にgo getされた段階でGo Moduleのキャッシュに記録される
  3. このタイミングでgithubのタグを正規のものに付け替えて、自身の痕跡を隠蔽する

という手法が取られていました。「一度キャッシュされたモジュールは永続的に利用可能」という特性が悪用され、プロキシ経由で悪意のあるパッケージを配布され続ける事態となりました。

もちろん、Go言語にも悪意のあるパッケージの配布を防ぐための対策が用意されており、主に以下の3点が紹介されました。

  • MVS(依存関係の中から常に最小の互換性のあるバージョンを選択する仕組み)
  • go.sum ファイルによるローカルでの検証
  • Checksum DB によるグローバルでの検証

しかし、これらの対策は正規のパッケージが改ざんされることを防ぐものであり、今回のようなタイポスクワッティングを発端とするようなサプライチェーン攻撃への対策としては限界があります。

Goのセキュリティ機能は非常に強力である一方、万能ではないことが明らかになったため、既存の機能でカバー出来るセキュリティの範囲を正しく理解し、それ以外の場所については、開発者による注意深い判断が求められると結論付けられました。

本セッションを通じて、ツールの能力と限界を正しく理解し、それらがカバーできない領域を人間が補う意識を持つことが、巧妙化するサプライチェーン攻撃からプロダクトを守るために不可欠であると感じました。近年トレンドとなっているAIコーディングも、もし開発者がチェックを怠れば、今回のような脅威を招きかねないため、ツールを賢く利用しつつも、最終的な責任は開発者自身にあるということを改めて認識する必要があると感じました。(清水)

Go で WebAssembly を利用した実用的なプラグインシステムの構築方法

本セッションは、Go言語と WebAssembly (WASM) を用いたプラグインシステムの構築方法について、実運用で得られた知見を基に解説したものでした。1 年半以上にわたる本番環境での運用から得られた具体的な経験が紹介されました。

冒頭、WASM をプラグインシステムに利用するメリットが示されました。サンドボックス機構によって悪意あるプラグインの実行(例: rm -rf /)を防げること、プラグインがクラッシュしてもホストアプリケーションに影響が及ばないこと、一度ビルドすればどこでも動くという高い移植性を持つことなどです。これらの特徴は、従来の Shared Library や RPC ベースのプラグインシステムでは解決が難しかった課題を補うものです。

一方で、WASM 導入にはいくつかの問題があることも紹介されました。

このセクションは、以下の3つの主要な問題が「壁」として紹介され、それらを乗り越えるための方法も示されました。

  • Network Socket / TLS の壁

    • 課題: GoのWASI P1ビルドでは、Network Socketが未対応で、sock_recvsock_sendの実装が存在しない、TLSを扱う際には、システム証明書ストアがないため、証明書を明示的に指定しない限り検証が失敗する
    • 解決策
      • dispatchrun/wasi-godispatchrun/netを組み合わせることで、Network Socketに対応

      • プラグインビルド時に、go build -overlaylinkname directiveを使い、標準ライブラリの実装をWASI P1用の動く実装に置き換えるアプローチで解決できる

      • net.DialContextcrypto/x509.(*Certificate).Verifyなどをホストの処理に委譲し、セキュアな実行を実現

  • コマンド実行の壁

    • 課題: GoのWASI P1ビルドでは、exec.Commandがサポートされていない
    • 解決策
      • 標準ライブラリの置き換えを利用し、

        os/exec.(*Cmd).Start/Stopをホスト関数に委譲

      • これにより、ホスト側で実行したくないコマンドを弾くなど、よりセキュアな実行が可能

  • 並行処理の壁

    • 課題: WASMインスタンスはシングルスレッドで非同期割り込みがないため、Guest関数を抜けると非同期処理も停止する
    • 解決策
      • wasmexportを使用せず、main loopでHostからのリクエストを待ち受け、ランタイムが停止しないようにする
      • HostとGuest間でs.Pipe()を使って通信し、HostはGuestのSTDINにリクエストを送り、GuestはHost関数を使ってレスポンスを返す

本セッションを通じて、WASM がプラグインシステムにもたらす可能性と、それを実運用に落とし込むための課題、さらに具体的な解決策を学ぶことができました。ツールの能力と限界を正しく理解し、カバーできない部分を開発者が補う意識を持つことの重要性を改めて実感しました。(平山)

全てGoで作るP2P対戦ゲーム入門

このセッションでは、複数言語を組み合わせて進められることの多いゲーム開発を、Go 言語だけで完結させる取り組みについて紹介されていました。「Go だけでゲームを作る」というアプローチは、シンプルで統一的な開発体験を実現するための一つの可能性として非常に興味深く感じました。

以下の通信要件を満たすゲームが紹介されていました。


  • マッチングはインターネットを介して行う
  • 自分と対戦相手のターン性を保つ仕組み
  • プレイヤーの操作は入力と出力のみで完結させる

実際に遊べるQRコードも紹介されていました。 また、ゲーム開始までの流れも具体的に解説されました。


  • 画面描画には Ebitengine を利用し、HTTPやCSSを利用せずに壁画を実現
  • マッチングには WebSocket を採用し、対戦相手との接続を確立
  • 実際の対戦は Ayame を用いた P2P 通信によって低遅延を実現
  • ゲーム開始後のデータ連携は channel を活用し、Go らしい並行処理でターン制を実装

このように Go のライブラリを組み合わせることで、ゲームの全体像がひとつの言語で構築されていく点が印象的でした。特に channel を使ったデータ連携は、Go ならではの強みをうまくゲームに応用していると感じます。 個人的に自分も対戦ゲームをよく遊ぶので、設計や仕組みの話をとても楽しく聞くことができました。Go 言語でゲームを作ることによって、言語が持つ高速な処理性能や並行処理のしやすさを活かしつつ、開発の一貫性や保守性が高まるメリットがあるのではないかと思います。 実際の商用レベルの対戦ゲームでは、ターン制よりもリアルタイム性が重視されることが多く、処理する要素も膨大になるため、さらなる工夫や技術の積み重ねが必要になるでしょう。しかし、今回紹介されたアプローチは「まずはシンプルにゲームの骨格を作る」ための非常に良い実践例であり、Go がゲーム開発分野においても可能性を秘めていることを実感しました。今後の発展にも期待したい内容でした。(松下)

発表資料

ワークショップ

Day 1 では、事前に申し込みが必要なワークショップも開催されました。

†開発を加速させる黒魔術講座†

「黒魔術」という怪しげな響きに強く惹かれ、このワークショップに参加しました。

このワークショップは、提示された8種類のテーマの中から、各自が興味のあるものを選んで自由に取り組むという形式でした。 テーマは、build時に特定の処理をフックさせるtoolexecのような実践的なものから、Goアセンブリでの関数実装、unsafeパッケージを使った非公開フィールドへのアクセスといった、まさに「黒魔術」と呼ぶにふさわしいマニアックなものまで多岐にわたりました。

会場では4人1組ほどのグループに分かれ、約1時間で各々が選択した課題に挑戦。その後、課題を通して得られた知見やテクニックをグループ内で共有し合いました。

自分はtoolexecに挑戦し、go buildした際にgopher君のAAを表示させたり、各処理のプログレスバーを表示させる処理をhookさせました。 これを応用すれば、各Packageのコンパイルにかかる時間なども計測できそうなので、CI/CDでも活用できそうだと感じました。

普段の業務ではなかなか触れることのないテクニックを学ぶことができ、好奇心が大いに満たされる楽しい時間でした。

このワークショップの資料はオープンソースとして公開されているので、ディープなテクニックに興味がある方はぜひ挑戦してみてはいかがでしょうか。(清水)

github.com

TinyGo + Gopherくん基板で遊ぼう

普段は電子工作に関わることがありませんが、Gopherくん基板の可愛さに惹かれて参加しました。

参加者には、GopherくんのマスコットキャラクターのGopherを型取ったオリジナル基板やセンサー、ブレッドボードが配られました。参加者はほぼ全員、Goは書いているけれどTinyGo未経験とのことでした。

今回のワークショップでは、ブレッドボードを用いて配線をし、すでに書かれているGoのプログラムをTinyGoでコンパイルし、それをマイコンボードに書き込む作業を行いました。

フルカラーLEDを光らせたり、赤外線通信を行ったり、液晶画面にGopherくんを映し出したりという作業を行いました。

Gopherくんを映したGopherくん基板

短時間だったので用意していただいたコードをそのまま動作させる、で終わってしまったのが残念ですが、実際に動かすことができてとても楽しかったです。 同様のプログラムはいろいろなところで開催されていそうで、機会があれば皆さんにも参加していただければと思います。(外山)

Goのカードゲームで遊ぼう

Sendai.go発進のオリジナルカードゲームを体験してきました!

Goを書いていなくても楽しめるカードゲームですが、カードの背面にあるデザインのコードは実際に動作するらしく、細部にこだわられています! カードゲームの様子

まずはプレイのお手本を見せていただきました。その後、他の参加者とコミュニケーションをとりながらゲームを進め、最後にはオリジナルの追加ルールを考えてプレイしました。 ゲーム性もあり、他の参加者とコミュニケーションを取る良い機会となりました!(外山)

まとめ

今回のGoConは、参加⁠申し込み開始から1週間後にはチケットが完売しており、それくらいの盛り上がりが会場からも伝わってきました!

Go Conference 2025 Day 1 が終了しました。開会から夜までセッションが盛り沢山で、Goコミュニティの熱気を直接感じることができました。

Day 2も引き続き、このブログでレポートをお届けします!

BBSakuraのメンバーはオリジナルのステッカーを持っています。登壇する早坂はもちろん、Tシャツを着たメンバーを見かけた際には、ぜひお気軽に声をかけていただけると嬉しいです! オリジナルTシャツを着た社員