こんにちは、BBSakura Networksの松下です。
本日2日目を迎えたGo Conference 2025(以下GoCon)に、BBSakuraのエンジニア6名で参加しました!
今年度のGoConではBBSakuraはブロンズスポンサーを務めており、本日は弊社エンジニアの早坂(@takemioIO)が「Goで体感するMultipath TCP ― Go 1.24 時代の MPTCP Listener を理解する」というテーマで登壇しました。 Goに標準で組み込まれたMPTCPをテーマに、実装や運用ノウハウに触れる実践的なセッションでした!
本日2日目は、セッションでの学びや、昨日の懇親会、スポンサーブースの様子を即日レポートします。


印象に残ったセッション
Go1.25新機能 testing/synctest で高速&確実な並列テストを実現する方法
本セッションでは、Go 1.25で追加された新機能 testing/synctestを用いた非同期テストを高速に実行させる方法について紹介されていました。
goroutineを使った非同期なテストには、以前より課題がありました。例えば、別のgoroutineで実行される関数の結果をメインのテストgoroutineで検証しようとしても、実行タイミングが保証されないため、たとえ単純なテストであっても失敗してしまいます。
これまでの一般的な対策は、time.Sleepを挟んで非同期に実行されている処理の完了を待つことでした。しかし、このアプローチにはテスト時間と安定性のトレードオフという問題が伴います。
Sleepの時間を長くすればテストは安定しますが、実行時間が長くなるSleepの時間を短くすれば高速になるが、実行環境によっては処理が間に合わずに失敗する、いわゆる flaky test(不安定なテスト) の原因となる
この課題を解決するのが、Go 1.25で標準パッケージとして導入されたtesting/synctestです。
本セッションでは、synctestの解説と、その重要なコンセプトであるbubble, durably blockedについて、実際の実装例を交えながら詳細に解説が行われていました
発表者からは、実際に社内のテストコードにsynctestを組み込んだ結果も共有され、実装は1〜2時間程度で完了し、実際に高速化を実現できたものの、既存のモックサーバーがそのまま使えず、テスト用にダミーの挙動を実装する必要があった、といった実践的な知見も得られました。
私自身、非同期処理のテストが不安定になり、結果としてSleepを多用してテスト全体が長大化してしまった経験があります。今回のセッションで紹介されたsynctestは、まさにその課題を解決してくれるツールだと感じました。社内のテストコードにも高速化できそうな箇所がいくつか思い当たるため、ぜひ積極的に導入していきたいと考えています。(清水)
panicと向き合うGo開発 - nilawayで探る見逃されるnil参照とその対策
Goのnil参照が原因で発生するpanicとなりうる箇所を検出するための静的解析ツールuber-go/nilawayについてのセッションでした。
標準パッケージに同梱されているnilnessでは、err ! = nilなら有効な値を返すという前提のもとで解析を行っています。
この前提に基づかない、関数やパッケージの境界を跨いだnil参照をnilawayでは検出することができます。これを実現するためnilawayは、プログラム中のnil値のフローを2-SAT問題としてモデル化しています。
- nilが入りうる箇所の次もnilが入りうる(nilable制約)
- nilが入ってはいけない箇所の前にもnilが入ってはいけない(nonnil制約)
このモデルにおいてnilableとnonnilとの矛盾の発生を検知することで静的解析を行っています。
しかし、以下のような場合は誤検知(偽陽性)の可能性があります。
net/httpのClient.Do()の返り値
loc := resp.Header.Get("Location") if loc == "" { // While most 3xx responses include a Location, it is not // required and 3xx responses without a Location have been // observed in the wild. See issues #17773 and #49281. return resp, nil }- respが空だがerrorもnilの可能性がある、とnilawayは指摘
- ステータスコード300台のときにerror = nil, Body = nilで返る仕様なので、それを前提に実装している場合、偽陽性となってしまう
これらの誤検知の対処として、nolintディレクティブの付与による回避やPRを送るなどが挙げられていました。
nilawayを導入することで大半のnil参照を防ぐことができるとのことで、導入価値は大きいと感じました。
nilawayがnil参照の複雑な問題へどのようにアプローチしているのか、http.Client.Do()のような身近な例でなぜ偽陽性が起きるのかを知ることができ、静的解析を身近に感じることができました。(外山)
Goのビルドシステムの変遷
このセッションでは、Go 言語のビルドシステムの進化を、歴史的背景とともに振り返って解説されました。初期の Makefile 時代から最新の Go Workspace に至るまでを時系列で追い、長年にわたる改善の歩みも示されました。
冒頭、Go が登場した当初の状況が紹介されました。最初期は Makefile によるコンパイル管理が行われており、その後 2010 年に goinstall が登場しました。さらに Go 1.0 のリリースで go get や go build が導入され、設定より規約を重視する思想のもと、手動での依存配置や Makefile の記述が不要となり、大きな前進を遂げました。しかし当時の go get にはバージョン管理の概念がなく、常に最新の HEAD を取得する仕組みだったため、依存関係の衝突や再現性のないビルドといった問題が残っていました。
2015 年に導入された vendoring はその暫定的な解決策でしたが、依存パッケージを vendor 以下にコピーする手間や、依存バージョンの管理が分かりにくいといった不満は依然として残っていました。その後、godep、gopkg.in、glide、gb などコミュニティ発のツール、さらに Go チームによる dep の提供といったさまざまな試行錯誤が続きました。
こうした経緯を経て、2018 年に vgo が登場し、翌年には Go Modules が正式に導入されました。go.mod と go.sum による標準化やモジュールキャッシュの導入によって依存管理は大幅に改善されました。しかし、依存先リポジトリが落ちるとビルドできない、リポジトリのタグが変更されると再現性が失われる、オリジナルリポジトリに過大な負荷がかかる、といった新たな課題も浮上しました。これを解決するために導入された Module mirror と Checksum DB は、セキュリティと可用性を大きく向上させました。
長期にわたる進化の過程においても、Go のビルドシステムは後方互換性を保持していました。さらに、直近では大きな変更も落ち着いて安定期に入っていると紹介されていました。
Go を使い始めてまだ 1 年ほどの自分にとって、このセッションは知らなかった歴史や背景を知る貴重な機会となりました。普段触れているのは最新の Go 環境だけなので、GOPATH や vendoring、さらにはコミュニティ主導で多くのツールが乱立していた時代のことをほとんど知りませんでした。go.mod や GOPROXY が当たり前に使える背景には、こうした試行錯誤の積み重ねがあることを実感し、Go の進化の裏にある工夫や苦労を改めて感じました。(平山)
Goで体感するMultipath TCP ― Go 1.24 時代の MPTCP Listener を理解する
Go v1.24からデフォルトで有効になったMPTCP(Multipath TCP)について、弊社エンジニアの@takemioIOが発表を行いました。本セッションでは、MPTCPの概要、Goにおける実装状況、さらにLinuxで培われた運用ノウハウが紹介され、非常に濃密な内容となりました。
MPTCPは、TCPをマルチパス化する技術であり、従来のTCPの利便性を維持しつつ、下層で複数のTCPコネクションを束ねる仕組みを提供します。主なメリットは以下の通りです。
- シームレスなハンドオーバー
- 帯域の集約
- 最適経路の選択
Apple MusicでMPTCP導入により音楽再生の停止回数や停止時間が減少したことや、Korea TelecommunicationがWi-Fiと4G LTE回線を組み合わせることで800Mbps超の帯域を実現したことが実際の活用事例として挙げられてました。
一方でMPTCPは万能ではなく、既存のミドルウェアとの相性に課題が残ります。発表では特にロードバランサー(LB)との関係に焦点が当てられ、LB経由での利用においては以下の工夫が必要であると解説されました。
- Subflowのパスが重複しないように制御する
- クライアントから直接到達可能なサーバーアドレスを渡す
これらをサーバー側で実現することで、LB環境でもMPTCPを安定的に利用できます。
Linuxにおいてはすでに豊富なMPTCP関連ノウハウが蓄積されており、Goの標準ライブラリでのMPTCPサポートも今後さらに成熟していくことが期待されます。
本セッションを通じて、MPTCPの利点と課題をよく理解でき、実装や運用に関わるエンジニアにとって学びの多い時間となりました。濃厚で歯応えのある発表でありつつも、GoとMPTCPの今後の発展を期待させる内容でした。(松下)
スポンサーブースの様子
スポンサーブースでは、各社が趣向を凝らした展示やノベルティを用意しており、とても楽しめました。スタンプラリー形式になっていて、スタンプを集めるとくじを引くことができ、景品が当たります。筆者は運良く「Go飯」をゲット!セッションの合間の良い息抜きになりました。

懇親会の様子
懇親会は前日の開催でしたが、多くの参加者と直接話すことができ、とても有意義な時間となりました。技術的な知見だけでなく、キャリアや日常的な取り組みについても共有できました!

まとめ
2日間にわたる Go Conference 2025 もついに終了しました。
最後の8連続LTも非常に盛り上がりがありました!
セッションでの学びはもちろん、スポンサーブースや懇親会を通じて新しいつながりや刺激を得ることができ、とても充実した時間となりました。
来年もまた、この熱気ある場に参加できることを楽しみにしています。








