Go言語の振り返り

Go言語を使い出してもうすぐ一年が経ちます。

この機会にGo言語の振り返りをしたいと思います。

Go言語のメリット

Goを学習して感じたメリット

  • 可読性が高い
    • gofmtが世界標準になっていて、プロジェクト毎に設定する必要がない
  • 標準パッケージが充実している
    • 標準パッケージでできる限りやるというのがgopherの思想になっているので技術選定が楽
  • 高速
  • シングルバイナリ
    • デプロイが楽
  • 後方互換性が保証されている
    • バージョンアップが楽
  • 並行処理が標準実装されている
  • 開発ツールが豊富(godoc, gofmt, go generate, go test, go vet)
  • OSSコードリーティングしやすい
    • 誰が書いても同じようなコードになる為OSSが読みやすい
  • エラーハンドリングが分かり易い
  • 依存パッケージのimportが最小限
    • 速い

筆者は静的言語もGoが初めてだったので、その学びも多くあった。

  • 型安全
  • エディタでの補完機能の享受
  • interfaceあり DI可能, MVC以外のアーキテクチャの知見を得られる
  • 最低限の低レイヤーへの知見を得られる

OSSコードリーディング

業務で扱う比較的大きめのパッケージは自然と読みに行く事も増えた。

SDKは特に読みに行く事が多い

tips

よく使う方法

  • vscodeのデバッカー
  • githubページで .を押してエディタを出す
  • godocから辿る

なぜ読むのか?

  • エラーがパッケージによって起きているか判別する為
  • 学び・有名OSSがどうやってGoを書いているか分かる
  • 他人が書いたコードを読む事に慣れる == キャッチアップが早くなる

チャネルとゴルーチン

本業のプロジェクトのチャットシステムや状態管理でRedisのPub/Sub 使用。

これをGoで実装する時 ゴルーチンとチャネルを使用した。

 go func() {
        pubsub := m.Client.PSubscribe(ctx, "__keyspace@0__:*")
        defer pubsub.Close()

        ch := pubsub.Channel()

        for {
            select {
            case <-ctx.Done():
            case msg := <-ch:
                switch msg.Payload {
                case "set":
       ...
}

パフォーマンス改善ではまだ使ったことがない。 個人アプリで定期実行の為に使った事がある。

設計

これまで携わったGoプロジェクトでのアーキテクチャは以下

チャットボット+web通話システム

GraphQLなのでResolverがController的な役割になる。 一応レイヤードアーキテクチャにしていたが、ところどころ依存関係が崩れていたり、usecaseが省かれてた。特に大きなバグとかもなかったが、属人性は高くなっていた印象。もう少しアーキテクチャを固くしてもいいと思っている。

toB SaaS (β版ではSaaSの認証システムを提供している)

usecase部分のinput, output構造体は省いた。 そこまで固くしてもあまりメリットがなかった為。 構造体はポインタ返し、プリミティブな方は実体返し、usecaseは必ず作る。楽さと固さを両立できていていい方針だと思う。

これまでに読んだ書籍や教材

書籍

動画

ネット教材

同人本

フォローしているGopherの方々

まとめ

この1年でGo言語を軸に色々な事を勉強しました。 つい昨日 Go1.18がリリースされたので早速ダウンロードして触ってみたいと思います。