はじめに
こんにちは、mercari.goスタッフの shota sugiura です。
9月7日にメルカリ主催のGo勉強会 mercari.go #23 をYouTubeでのオンライン配信にて開催しました。この記事では、当日の勉強会の活動内容をレポートします。動画も公開されていますので、こちらもぜひご覧ください!
mercari.go #23では、株式会社ナレッジワークより@tenntennさん、株式会社カウシェより@yuki.itoさん、株式会社Stackより@そな太さんをお招きして、パネルディスカッション形式でGoに関する意見交換をしていただきました。Go1.21が2023年8月にリリースされたことを受けて、Goのモダンな書き方やError Handlingの方法、Go1.21で利用したい新しい機能をテーマに、各社の事例を交えた興味深い議論が行われました。
mercari.goスタッフとして、イベント視聴した私の感想も含め、パネルディスカッションの内容を簡単にまとめてご紹介します!
テーマ1: Goのモダンな書き方
https://www.youtube.com/watch?v=QtLTQkAj8ec&t=126s
最初のテーマでは、各社の事例を元にしたGoのモダンな書き方についてお話していただきました。
@yuki.itoさんからは、カウシェで実践しているモノレポでのマイクロサービス開発について話していただきました。モノレポにすることで、会社としてのスタンダードなパッケージ構成の提供やビジネスロジックに関わらない処理の共通化ができ、プロダクト全体の品質を担保できます。最近リリースされたgonewというツールを早速使っていて、これを利用して会社標準の新しいアプリケーションを素早くスピンナップできるようにしているそうです。また、全社で共通のgo.modを使ってモジュールの管理をしているというのも非常に興味深い話でした。
Go 1.21に入ったツールチェーンに関する変更についても触れられました。go.modに書いてあるversionをみてツールチェーンのアップデートが自動でかかるようになったなど、嬉しい変更が入っています。これに関連して、Goのビルドの完全性に向けた取り組みについてのブログが話題に上りました。最近特に、Goチームがサプライチェーンアタックへの対策に力を入れているようで、こういった言語標準レベルでの取り組みによってGoがより便利で安全なものになっているのだなと感じました。
テーマ2: Error Handling
https://www.youtube.com/watch?v=QtLTQkAj8ec&start=1545s
過去のmercari.goでもたびたび話題になっているError Handlingですが、パネラーの方々それぞれのアプローチが聞けて参考になりました。
@そな太さんは、標準のインターフェースを利用できて、かつスタックトレースを取りたいという理由からxerrorsを使い続けているそうです。特に困ることはないそうですが、最新標準に入った複数のエラーをラップする機能などを利用できないデメリットを許容できるかは考えどころです。
@yuki.itoさんは、標準のパッケージのerrors、fmt.Errorfを利用しているそうです。スタックトレースは取れないですが、必ずエラーの発生箇所を特定できるような有意なメッセージをつけてエラーをラップするというのを社内で徹底しているそうです。ただ、うっかりラップし忘れるのを完全に防げるわけではないので、linterなどで機械的に防ぐのも良いかもしれないとお話されていました。
@tenntennさんからは、非常に面白いアプローチが紹介されました。Goチームが管理しているpkg.go.devのinternalなpackageにderrorsというものがあり、このパッケージのWrap関数を真似して利用しているそうです。名前付き戻り値でエラー変数を定義し、そのポインタを引数に渡してderrors.Wrapをdeferで呼ぶと、nilでないエラーが返ってきた時に必ずラップする仕組みになっています。エラーのラップだけではなくて、GCPのError ReportingやSentryのようなエラー通知の処理も挟むことができるのでとても便利そうです。
このほかにも、クリーンアーキテクチャーにおけるエラーの扱いや、ログレベルに関する話など、多くの人が気になっているであろう話題に関して各々の取り組みを紹介いただきました。
テーマ3: Go1.21で利用したい新しい機能
https://www.youtube.com/watch?v=QtLTQkAj8ec&t=3140s
このテーマの最初に話題に上がったのは1.21で導入されたslogです。@yuki.itoさんと@そな太さんはまだ本番では利用できていないですが、ゆくゆくは今利用しているライブラリを置き換えてslogを利用してくことを検討しているそうです。既にサードバーティのライブラリで実現できていた機能ではありますが、そのような誰しもが使う機能が標準に入ったことの意味は大きそうです。
Go1.21ではあらたにmaps, slicesパッケージが導入されましたが、このmapsパッケージに入る予定だったmaps.Keys, maps.Valuesは1.21のリリース直前に削除されました。この動きの背景となっているiteratorのデザインや、それを利用したxiterパッケージのプロポーザルに関する話題でパネルディスカッションが盛り上がりました。今まさに議論されている機能なので、これがどのような形でまとまって実装されていくのかとても興味深いですね。
おわりに
今回はいつものmercari.goとは一味違うパネルディスカッション形式の勉強会をお送りしました!Goのモダンな書き方や今後の展望など、Goの最先端の情報を追っているお三方ならではのお話を楽しんでいただけたのではないでしょうか?
ライブで視聴いただいた方も録画を観ていただけた方も本当にありがとうございました!
次回のmercari.goでは、9月末に開催されるGopherCon 2023の参加者を集めて活動報告会を開きます。10月下旬に開催する予定なので、メルカリcompassグループのメンバーになってイベントの通知をお待ちください。次回もお楽しみに!