【イベントレポート】Go言語/最新情報・活用事例セミナー

Go言語最新情報・活用事例セミナーサムネイル

こんにちは!TECH Street編集部です!

2023年6月15日(木)に開催した、 「Go言語/最新情報・活用事例セミナー」のイベントレポートをお届けします。

今回はGo Conferenceの主催や一般社団法人Gophers Japanの理事を務める清水 陽一郎さんと、一般社団法人Gophers Japan の監事として Women Who Go Tokyo や Go Conference といった Go 言語コミュニティを運営されている白川 みちるさんをお招きしてGo言語を学ぶセミナーを開催しました。その様子をレポートいたします。

 

登壇者はこちらの方々!

清水 陽一郎さん/株式会社LayerX
白川 みちるさん

早速、内容を紹介いたします!

まずは株式会社LayerX 清水 陽一郎さんの発表です。

Go言語セミナー「今日から始めるGo」

今日から始めるGO

清水:まずは弊社「株式会社LayerX」の紹介をいたします。
「すべての経済活動を、デジタル化する。」というミッションを掲げる弊社は「バクラク」シリーズ(下記に説明あり)に代表される経理業務を効率化するプロダクトを中心に開発しており、私はGo言語を活用した法人カードの作成をしています。

バクラクシリーズラインナップ

バクラクシリーズの説明

では、「Go言語」の説明に入っていきます。今回は初心者の方向けに説明していきたいと思います。

Go言語とは?

Go言語とは2007年にGoogleが開発したプログラミング言語であり、言語の特徴をまとめると…

  • 強い静的型付け、型推論
  • コンパイル言語
  • 手続き型
  • オブジェクト指向ではない
  • ポインタがある

という特徴があります。

Goとは

小さいアプリ開発から大規模なシステム開発まで、すべてを一つの言語でカバーできる使い勝手の良さから、近年人気が高まっています。そして世界的に有名な会社や国内でもメガベンチャーと言われるような会社でよく使われています。

Goで作られたOSS

  • Docker
  • Kubernetes
  • Terraform
  • TiDB
  • Prometheus
  • etc…

利用企業の例

誕生背景・設計思想

「ではGo言語は何を目的に作られたのでしょうか?」
それはGoogleのソフトウェア開発の中で発生していた課題を解決するためでした。Go言語登場以前のGoogleソフトウェア開発にはC⁺⁺やJava、pythonなど既存のプログラミング言語を活用していましたが、ビルド時間にコストがかかりプログラミングコードの安全性にも課題を感じていました。そこで

  • コンパイル速度が速いこと
  • 安全に書けること
  • 本質にフォーカスした開発ができること

上記の点を目的としてGo言語が作られました。
Go言語は数学的な表現をしっかりするためというよりは、ソフトウェアを作る中で発生していた課題(ビルド時間のコストやコードの安全性)を解決するために生まれた言語です。

Go言語は、「スクリプト言語のプログラミングの容易さ」「コンパイル言語の効率と安全性」の良いとこどりをして、ネットワークプログラミングやマルチコアコンピューティングで性能が発揮できるような言語にしたといえます。

simplicity(徹底的な簡潔性)の概要

Go言語の設計思想として「simplicity - 徹底的な簡潔性」を掲げておりソフトウェア開発がスケールするように、「大規模開発ができるようにする」ということと「動いているソフトウェアも大規模に使えるようになること」をミッションとしています。

Simplicity-徹底的な簡潔性

安定した言語仕様

他の言語を使っていると言語自体のメジャーバージョンアップで大変な時があるかと思います。
一方、Go言語は今までメジャーバージョンアップしたことがなく、バージョンアップによるメンテナンスのコストがほぼかからない言語となっています。

安定した言語仕様

ここまでのまとめ

ここまでのまとめ

ここまでで紹介した内容を簡単にまとめると、Go言語は皆さんが知っているような企業やサービスで使われてます。そして、Go言語自体はどういうことを目的としているかというと、ソフトウェアをスケールさせることをミッションにあげています。

言語仕様

ここからはGo言語の仕様について説明していきます。まず特徴的な仕様は「予約語が少ないこと」です。

少ない予約後

予約語は25個しかありません。Go言語特有の予約語だと「defer」「go」などがありますが、それでも他の言語を使っている方でしたら、見たことある予約後がほとんどだと思います。
スライス(配列の要素数を可変にすることができるデータ構造)の構成要素もシンプルで理解しやすい特徴があります。

少ない予約語

スライスとrange

  • 可変長配列
  • オブジェクトに対する反復処理

ポインタ

最近の言語を使っている方だと、見慣れないかもしれませんが、「ポインタ」があります。

ポインタ

interfaceの概要

柔軟性の高いinterfaceも要注目の仕様です。
例えば4つや5つの構造体が入っているメソッドのうち、「このメソッドだけを使いたい」というときは、そのメソッドを持っているinterfaceを自分で定義して、そのinterfaceごしにDIをするだけで実装することが可能です。OSSや既存のライブラリを使うとき、自分で好きなようにinterfaceをきれるので、設計に柔軟性があるといえるでしょう。

interface

goroutineとchannelの概要

またGoと言えば並行処理で話題になると思いますが、goroutineで動かすと並行処理ができて、複数の軽量スレッドを立ち上げることができ、チャネルという機能を使えばスレッド間でデータのやり取りが可能です。

goroutineとchannelの概要

多値とエラーの概要

「エラー」というinterfaceがあり、それを使って異常系の処理ができます。例外機構はないので、何かメソッドを実行して異常系を表現したい場合は、戻り値の最後にエラーを返すようにして、呼び出し側でエラーではないことを確認して、リターンを書く必要があります。

多値とエラー

Genereics

コミュニティ内から、「Genereicsが欲しい」という声があり、Go1.18からGenereicsが導入されました。Genereics自体は他の言語と書き方は同じです。

Genereics

slog

Go1.21から「slog」と呼ばれる構造化ログが標準ライブラリに入ります。

slog

web開発とGo言語

Web開発に対するGo言語のメリット

並列処理が強力なので、標準パッケージを使うだけでも、本番に耐えられるようなサーバーをすぐ作り上げることができます。また、データベースにアクセスする時もコネクションプールが標準パッケージであるので、気にせずにデータベースにアクセスができます。

あと、新しいPCでプロダクトのセットアップをするときも、Goをインストールするだけですぐにテストをかけたり、依存性管理ができたりするので、あまり初期構築でつまづくことがないと感じました。

Web開発とGo

Go自体はいろんなランタイム環境で実行可能なので、どんなところからでもサービス開発できるかなと思っています。

Web開発とGo

Goを始める

「簡単とはいえ何から始めればいいかわからない」という方のために、Go言語を学ぶ場所をいくつかご紹介します。

例えばGo Conferenceが運営する「Gopher道場」では「Go言語以外の言語で日々の開発を行っているエンジニア」「Go言語を学ぶ熱量が高い方」「Go言語を仕事として使う機会がないため、実践的なものが学ぶ機会がなくて学べてない方」などを対象として、実践的なGo言語を体系的に学べる場を提供しています。

Gopher道場

・Gopher道場とは、実践的なGoを体系的に学べる場です。
 ・https://gopherdojo.org/

・動画
 ・https://www.youtube.com/@gopherdojo

・スライド
 ・https://tenn.in/go

・Gopher道場の動画コンテンツを完全公開しました
 ・https://zenn.dev/gophersjp/articles/834d6382991674

書籍

動画やスライドを見るだけでも、Goに詳しくなれると思います。
本をよんでじっくり学習したいという方には関連する書籍も多数ございます。

・初めてのGo言語 ー他言語プログラマーのためのイディオマティックGo実践ガイド
・Go言語プログラミングエッセンス
・実用Go言語 ーシステム開発の現場で知っておきたいアドバイス
・Go言語による分散サービス ー信頼性、拡張性、保守性の高いシステムの構築
・エキスパートたちのGo言語 一流のコードから応用力を学ぶ
・Goならわかるシステムプログラミング 第2版

まとめ

・Goはソフトウェア開発の課題解決を目指した言語
 ・Creating software at scale
 ・Running software at scale
・強力な並行処理と素朴な言語仕様
・2022年以降は日本語書籍・web学習も豊富で始めやすい!

 

 

 


続いては、白川みちるさんの発表です!

Go言語LT「みんなで楽しむ Go」

みんなで楽しむGo

開発言語のキャッチアップはとても大変!

白川:開発エンジニアとして「開発言語のキャッチアップ」はとても大変だと思われた方々も多いのではないでしょうか。そこで、今回はGo言語を楽しくキャッチアップする方法として

  • 1人で楽しむ
  • 会社で楽しむ
  • カンファレンスで楽しむ
  • コミュニティで楽しむ

という、以上4つの方法を私から楽しくキャッチアップできる方法をご紹介できればと思います。

1人で楽しむ

1人でキャッチアップするのは本で楽しむのが良いと思います。下記の書籍がオススメです。

書籍で楽しむGo

  • プログラミング言語Go
  • Go言語による並行処理
  • Go言語でつくるインタプリタ
  • Go言語プログラミングエッセンス
  • 詳解Go言語 Webアプリケーション開発

Go語の仕様など一通りきちんと知るためにおすすめの書籍は「プログラミング言語Go」「Go言語による並行処理」です。

体系的に手を動かしながら学ぶとなると「Go言語でつくるインタプリタ」がおすすめです。テストコードを書きながらインタプリタが作れる点がいいですね。

最近出たものとしては「Go言語プログラミングエッセンス」「詳解Go言語 Webアプリケーション開発」があり、こちらも手を動かしながら読み進めることができて、実践的なのでおすすめです。

Webで楽しむGo

もちろんWebでもキャッチアップすることできます。

おすすめサイト

困ったときは公式サイトがおすすめです。先ほど清水さんがご紹介した【Gopher道場】もGo言語を楽しんで学ぶには最適な場所だと思います。

会社で楽しむ

会社で楽しむ一例として、メルカリ(※)で行っているGo言語のオンボーディングをご紹介します。

(※以前はメルペイに所属しておりましたが、現在は株式会社カウシェでバックエンドエンジニアとして勤めています)

参考資料:メルカリの2023年技術研修DevDojoの資料と動画を公開します!

Dev道場概要

DevDojo概要

メルカリグループでは技術研修として「DevDojo」を提供しています。エンジニアメンバーが互いに学び合い、成長しあう文化の醸成を助けていますが、その道場の資料が一部一般公開されています。ここには載っていませんが、Go言語のDevDojoも存在します。

Dev道場概要のカリキュラムなど

研修内容

誰でも自由に参加可能ですので、会社で利用している技術スタックに幅広く触れることができます。
研修内容の中に「モブプログラミング」があります。これは相談しながらものづくりをすることを通して、時には「人に説明をすることで知識を深めること」を目的としているからです。
互いに学び合い、成長しあう文化のもとに、以前DevDojoで学んだ新入社員やベテランエンジニアたちがメンターとして参加し、毎回内容をブラッシュアップしています。

カンファレンスで楽しむ

「Go Conference 2023」はプログラミング言語のお祭りであり、初学者から上級者まで、幅広い人に向けたセッションやコンテンツが揃っています。「バーチャル空間で集まって配信を楽しむこと」「カンファレンスに参加して楽しむこと」「登壇や運営に参加して楽しむこと」などいろいろな楽しみ方があるので、ぜひ公式サイトをチェックしてみてください。

Go Conference 2023 の公式ページ

また海外カンファレンスに参加するのも価値あると思います。

海外カンファレンスの様子

海外カンファレンスの様子

 

コミュニティで楽しむ

日本だけでもGo言語に関するコミュニティは多くあります。

Goコミュニティの一覧

Goコミュニティの一覧

この中で「Women Who Go Tokyo」は私が主催している勉強会です。

  • Go 言語に興味があるけど周りにやっている人がいない
  • どうやって勉強したら良いかわからない
  • 学ぶ仲間がほしい

という人は他のコミュニティも含めてぜひ気軽に参加してみてください。

白川さんが主催するコミュニティ「Women Who Go Tokyo読書会」

白川さんが主催するコミュニティ「Women Who Go Tokyo」

まとめ

開発言語のキャッチアップはとても大変ですが、楽しいです。
Go言語に限らず、技術のキャッチアップのバリエーションは豊富なので、自分にあった楽しみ方を選んでGo言語を使う人が増えていくといいなと思っています!

Q&Aコーナー

続いてQ&Aコーナーであがった質問を紹介します。

(Q)オブジェクト指向じゃないんですね! であれば初心者向けだったりもしますか?(未経験者より)

清水:プログラミング言語に縛られず、エンジニア向けの書籍(勉強素材)がオブジェクト指向ベースだったりするので、Goではない書籍のプラクティスをそのまま適用するとアンチパターンになる可能性があります。

(Q)もしもGo2がリリースされるとなると、大変な騒ぎになるのでしょうか?

清水:なると思います。1.20のときにGo2になるか?みたいな話は以前ありました。
最近公式ブログで言及があって、実際Go2がでることはほぼなさそうです。https://go.dev/blog/compat

(Q)RUSTとの違いは簡単に言うとどのようなところでしょうか?

清水:答えられないです…。RUSTはHello Worldくらいしか触ったことがないので…。

(Q)Goに適した統合開発環境は何でしょうか?

清水:GoLandを使っています。VS Codeの方なども多いです。
最近だと、GitHub Copilotがすごいです。お使いのIDEで始めてみてください。

(Q)今後の変更で一番有力なものはありますか?

清水:ログレベルと構造化ログを標準ライブラリでサポートしたslogパッケージに注目です。
https://tip.golang.org/doc/go1.21#slog
slogパッケージは20238月にリリースされたGo1.21で無事リリースされました。https://go.dev/doc/go1.21

(Q)Go開発の際に、メンテナンスとかアップデートで特異な注意点とかメリットなんてありますでしょうか?

清水:アップデートしやすいところです。リリースの時点で使ったバージョンのまま止まってることってよくある。アップデートしても、コンパイルエラーも沢山出たりしないので、楽です。

(Q)このあと出てくるのかもしれませんが、Go応用編にてデモがあると助かります<(_ _)>

清水:Gopher道場とかYouTubeをチェックしてみてください!

(Q)著名なDevOps関連ツールであるterraformやDockerやDocker, Kubernetes等がGoでできてる理由は何故でしょうか?WebとDevOpsのどちらに需要があるのでしょうか?

清水:色んな環境に配りたい時にすごく楽です。書き方が統一されてる、テストも標準化されているので、よく使われているのではないでしょうか。

(Q)Goのフレームワークの状況が知りたいです。

清水:HTTPだと、echoかgin。GprahQLならばgqlgen。
ORMは群雄割拠だと思います。個人的にはsqlxがシンプルで好きです。

(Q)「詳解Go言語Webアプリケーション開発」が、他のGo本に比べてお薦めな部分はどこでしょうか?

清水:薄めに書いています。最初に読んだ人がWeb開発するときに気をつけるべきところが、薄さの割には情報盛りだくさんです!(後半のハンズオンはWebの正誤表みてください。)フォローアップが厚いです!!

(Q)Goによるプログラミング開発やテスト作業は、ChatGPTやGithub Copilotによるサポートとの相性がどれぐらいよいかはわかりますか?

清水:良いと思います!型がある分、AIも予測しやすい。意図通りの回答が返ってきやすいです。

(Q)GoのWeb開発をVS Codeで行うときには、どのプラグインがお薦めですか?

清水:標準のGoプラグインを入れると、一通りOKかと!

(Q)WEBのバックエンドを開発する際のおすすめのフレームワークはありますか? PHPならLaravel, RubyならRailsとか有名なのがありますが、Goの場合はどんなのがあるのかなぁと思いまして。

清水:gRPC。graph GRL。標準パッケージが好きです。

(Q)Fiberというフレームワークが海外で人気になってきているようですが日本ではどれくらい使用されていますでしょうか。今後ginやechoと並ぶくらいのシェアになりえますでしょうか

清水:Goを使ってる会社は3社ほどいましたが、使ったことはないです。高トラフィックかつパフォーマンス要件が厳しいプロダクトでなければ最初に選ばなくてもいいのかなと思います。

(Q)goroutine で リソース管理したくなりませんか? # どこまで go に お任せするものか悩ましく思うことがあります...

清水:個人的な経験ではファイルを複数DL(UL)したいときにgoroutineを使ったことありますが、API書くときに直接使うことはあまりなかったりします。パフォーマンスに問題がでるまで素朴にやる派です。並行処理はバグが入り込む確率が高くなり、再現も困難なことが多いので。

(Q)GoはTDDやDDDに向いてますでしょうか!

清水:TDDは向いていると思います。
DDDはドメインを理解して、業務を理解して、という前提であればいいと思います。DDD本に書いてあるようなレイヤードアーキテクチャなどを厳密に実践しようとすると、難しいです。public/privateという概念はないので、軽量DDDのような構成をしようとすると失敗します。

(Q)Goの質問から離れて恐縮ですが、gRPCってサービスのどんな機能部で使われるのでしょうか?

清水:一般的な話をすると分散サービスで構成されているプロダクトの内部通信で利用されることが多いのかなという印象です。外部公開するAPIはREST APIであることがデファクトスタンダードなので。

(Q)goだと標準ライブラリで並列処理が実装出来る様な話があったと思います。具体的に並列化出来る処理内容が知りたいです。

清水:もちろんテクニックを使えば同期的にも書けるのですが、基本は「分割したタスクがそれぞれ干渉せずに完了できる」状態に分けられると並行処理ができます。
具体的なテクニックは「Go言語による並行処理」を読むのがおすすめです。
https://www.amazon.co.jp/dp/4873118468
並列処理と並行処理は異なるので、「Concurrency is not parallelism」も見ておくとよいです。
https://go.dev/blog/waza-talk

(Q)型パラメータのゼロ値を返すときに`*new(T)`のイディオムを使われますか? それともNamed return valuesを使ったりしますか?

清水:自分で書くときはhttps://github.com/samber/loを使ってしまうかなと思います。実装もスッキリしているかなと思います
 https://github.com/samber/lo/blob/v1.38.1/type_manipulation.go#L74 // Empty returns an empty value. func Empty[T any]() T { var zero T return zero }

(Q)GoはOberon2を現代風にしたような感じですね、しかしオブジェクト指向脳にシフトしてしまった頭だと、度々つまずいています。なにか良いアプローチはありますか?

清水:参考になるかわかりませんが、バッチ処理のようにいったん愚直に処理とテストコードを実装して、その後リファクタリングですっきりさせていくアプローチはよくします。手を動かす前に見えないことも一旦洗い出せるので。
(不勉強でOberon2は知りませんでした、すいません)

(Q)白川様、ツキノワグマな理由は特になしですか?(Goに関係あり?)

白川:Goには関係ないです!クマの話をすると長くなりますw

(Q)やっぱGo楽しいですか?!(他と比べても)(私は楽しいです)

白川:楽しい!

(Q)初心者(コボラー経験のみ・でもシステム開発経験は長い)ですみません、最初にもありましたが、Goは手続き型ならコボラーでも取りつきやすいのかしら?

白川:取っつきやすいと思います。(白川さんはCobol書いたことないです)まずやってみるといいと思います!

(Q)2ヶ月ほど前にGo言語に入門した者です。WebAPIの個人開発でgoroutineを使ってみたいのですが、実際のサービスに使われるような機能の題材はありませんか!

白川:現在はマネージャーとしてピープルマネジメントの仕事をすることが多くて、業務で触れることはしばらくありません。しかし、コミュニテイ活動で、ハンズオン用に作ってみたことはあります。大量の画像を変換する処理に使いました!

(Q)Goならではのオンボーディングの難しさとか簡単なポイントとかってありますか?

白川:「ならでは」の難しさはそんなに感じたことはないです。始めて、Rubyを触ったときに、開発環境をエラーなく構築するのが大変とよく聞く。その分Go言語にはそういうことは少ない。

(Q)いろんな情報があって初めどこから学べば良いのか悩むのですが、web api用途とすると、どの書籍から入るのがよいのでしょうか?jsが書けるエンジニアです

白川:清水さんの書籍で勉強してみてはいかがでしょうか!とてもマッチしていると思います。

(Q)GoのIDEで、複数のエンジニアが同時に編集できるものはありますか?それともモブプログラミングはみんなで書くのではなく、だれか1人がエディターする感じでしょうか?

白川:VS Codeとかできます。私の場合は、誰かが画面をシェアしているのを、みんなで囲んでやっていました。

(Q)ご登壇のおふたりにお聞きしたいのですが、Goを選んだ一番の理由は何でしょうか?

清水:C言語で開発していたとき、開発のリズムが良くないなぁと感じていた。そんな時にGoを触ったら便利だった!コンパイルが速くて、テストもスムーズで良かった!

白川:エンジニアでPHPを長くやっていた。どうしてもパフォーマンスを出したいバッチ処理があった。新しい技術を取り入れるチャンス!という流れがきたので、Goを取り入れてみた。goroutine も使った。パフォーマンスが出た!初めて書いたけど、キャッチアップしやすくて好きになりました。

(Q)Goの中で特に重要だと思う特徴とか機能は何ですか?あと、それのメリットなんかもぜひお聞きしたいです。

清水:gouroutineはすごく恩恵を受けてるなと感じます。パフォーマンスを気にしたことはほぼないです。他言語を使っているチームと比較しても、メモリも全然使わないし、パフォーマンスも落ちないのでとても良いです。コードの可読性も高いです。

白川:コードの読みやすさはその通りで、とてもいい。また、以前Javaを使っていたが、コンパイルはGoの方が速いと思いました。(Delphi をやっていたこともありますが、それも時間がかかった記憶...)

(Q)Goだと1つのファイルに大量のコードを書いているのを見かけるのですが、Goのおすすめのファイルの分け方とか、パッケージの分け方とかはあるのでしょうか?

清水:パッケージの分け方は度々話題になります。あまり分けすぎない方がいいと思います。1~2階層くらいがいいです。テストコードが縦にめちゃくちゃ長くなるのはある。そんなに私は気になったことはないです。
単一ファイルに大量のコードという状態は、もしかしたら処理の抽象化などをして複数の構造体に責務分担をすると自然に構造体(ファイル)も分割されるかもしれません。

白川:大量がどれくらいかにもよりますが。。そんなにコードは大量にはならないかなと思います。
ただ大量なものを大量だと感じていないのかもです。テストコードは長くなります。Go言語でインタプリタを書く本なども、テストコードは長かったです。
パッケージの分け方は、フレームワークなどを参考にするといいかもしれません。

(Q)Go言語の将来についてどのような展望をお持ちですか?将来のバージョンやアップデートで期待される新機能や改善点について教えていただけますか?

清水:与えられたもので満足していますw
強いて言うなら静的解析などはどのサードパーティを使うか、紆余曲折を経るので、バシッと統一されると嬉しいです。

白川:今はもう長いこと業務でコードを書くことがなく、個人開発やイベントで触れるくらいなので、今で大満足です。シンプルさが気に入っています。

(Q)モブプロを文化にしたい(ウチぜんぜんそういう感じじゃない)のですが、第一歩としてどうすればよいでしょう?

清水:会議体などをもうけず、まず日常的に「うまく実装できないので画面共有しながら実装フォローしてもらって良いでしょうか」みたいなことをやってみるでもよいかなとは思います。

白川:オンボーディングの時に導入したからといって、実際に現場で使っているかはわからない。モブプロの良さを知ってもらったり、モブプロをする曜日を決めたりするといいかもです。

最後にお2人からコメント

清水:初歩的な紹介ばかりでしたが、具体的な事例などの質問があれば、冒頭でご紹介したカジュアル面談やTwitterでDMをいただければと思います。

白川:人前でお話するのは久しぶりだったので、とても良い経験でした。勉強会も開催しているので、興味がある方はぜひ遊びに来てください!

 

 

次回のイベントレポートもお楽しみに♪