Go言語の振り返り
Go言語を使い出してもうすぐ一年が経ちます。
この機会にGo言語の振り返りをしたいと思います。
Go言語のメリット
Goを学習して感じたメリット
- 可読性が高い
- gofmtが世界標準になっていて、プロジェクト毎に設定する必要がない
- 標準パッケージが充実している
- 標準パッケージでできる限りやるというのがgopherの思想になっているので技術選定が楽
- 高速
- 直接機械語に翻訳している
- シングルバイナリ
- デプロイが楽
- 後方互換性が保証されている
- バージョンアップが楽
- 並行処理が標準実装されている
- 開発ツールが豊富(godoc, gofmt, go generate, go test, go vet)
- OSSコードリーティングしやすい
- 誰が書いても同じようなコードになる為OSSが読みやすい
- エラーハンドリングが分かり易い
- 依存パッケージのimportが最小限
- 速い
筆者は静的言語もGoが初めてだったので、その学びも多くあった。
OSSコードリーディング
業務で扱う比較的大きめのパッケージは自然と読みに行く事も増えた。
- gorm https://github.com/go-gorm/gorm
- gin https://github.com/gin-gonic/gin
- echo https://github.com/labstack/echo
- gqlgen https://github.com/99designs/gqlgen/tree/master/graphql
SDKは特に読みに行く事が多い
- aws-sdk-go https://github.com/aws/aws-sdk-go
- line-bot-sdk-go https://github.com/line/line-bot-sdk-go
- sendgrid-go https://github.com/sendgrid/sendgrid-go#example
tips
よく使う方法
なぜ読むのか?
- エラーがパッケージによって起きているか判別する為
- 学び・有名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
GraphQLなのでResolverがController的な役割になる。 一応レイヤードアーキテクチャにしていたが、ところどころ依存関係が崩れていたり、usecaseが省かれてた。特に大きなバグとかもなかったが、属人性は高くなっていた印象。もう少しアーキテクチャを固くしてもいいと思っている。
toB SaaS (β版ではSaaSの認証システムを提供している)
- クリーンアーキテクチャ
- OpenAPI
- 軽量DDD
usecase部分のinput, output構造体は省いた。 そこまで固くしてもあまりメリットがなかった為。 構造体はポインタ返し、プリミティブな方は実体返し、usecaseは必ず作る。楽さと固さを両立できていていい方針だと思う。
これまでに読んだ書籍や教材
書籍
動画
ネット教材
同人本
フォローしているGopherの方々
- tenntennさん tenntenn.dev
- 言わずもがな
- さき(H.Saki)さんhttps://zenn.dev/hsaki
- 初級向けの解説記事が大変分かり易い。
- NoboNoboさん https://zenn.dev/nobonobo
- teratailでGo関係の質問をすると大体答えて頂ける。
- mattnさんhttps://mattn.kaoriya.net/
- Google Developer Experts Goの方
- Go 1.18 でやってくる Generics とは - GDG DevFest Tokyo 2021 - YouTube
まとめ
この1年でGo言語を軸に色々な事を勉強しました。 つい昨日 Go1.18がリリースされたので早速ダウンロードして触ってみたいと思います。