📚

『APIを作りながら進むGo中級者への道』読んだ

2023/02/04に公開

Goの勉強をもっとしたいなと思っていた頃、たまたま見かけて気になっていた本を、一通り読み終わりました。率直に良かったので感想を残しておきます。購入を検討されている方の参考になれば幸いです。

読み手について

  • 普段はPythonで開発をしているサーバーサイド&クラウドインフラエンジニア
  • HTTPやDockerやMySQLの前提知識は持っていた
  • Goは2年ほど前に1回開発(バッチの処理を一部改善するくらいの軽微なもの)で入門していたが、それ以降触っていなかったのできれいさっぱり忘れていた
  • 本を読む直前にGo公式サイトのチュートリアルで文法やAPIを作って再入門していたが、まだ何か作るにあたってパッと書けるような状態ではなかった

本を選んだ動機

求めていたものとしては以下でした。

  • 開発周りで必要とされる知識やGoの書き方をインプットできる
  • できればハンズオンベースだと嬉しい

本の検討にあたって元々知っていた本書と、Amazonで見つけた2年以内に発売された本をいくつか探していたのですが、

  • 実践に近い内容
  • ハンズオンが充実していた

といった点と、第一章が無料で公開されていたのでそれを読んで購入を決めました。

読んでみて

良かった点

  • 540ページほどあるのですが、ほぼ全部ブログAPIを作るハンズオンがベースになっている
    • pdfなので実感しにくいが、比較していた本の中でも分厚い部類に入っていた
    • 図やサンプルコードも充実しているのでそれの影響もあるかも
  • 著者のGitリポジトリに章、sectionごとのコードが置いてあるので、本で追いきれなくなったり、本で省略されている箇所で「あれこの部分どうなっていたっけ?」と思う箇所があってもスムーズに追えるようになっている
    • 本通りに書いたはずなのに動かない…どこがおかしいのか分からん…困ったぞ…みたいなことは起きませんでした
  • 設計面での学びが多かった
    • 一般的なハンズオンだとある処理が最低限動くことが目的で作られているので「実際こういう書き方しないよね」といったものが見受けられるが、この本は最初に分かりやすさ重視の実装をした後「ただ今の書き方だと〜なところが良くないので、〜できるように書き直してあげます」といった形で後半からめちゃくちゃリファクタリングが入る
    • 私はプログラミングの設計周りの苦手意識があったので、その辺りの考え方や、Goだとどういう実装で実現できるのかと参考事例が豊富でとても勉強になりました
  • ただ書いて動いて終わりでなく、Goの標準ライブラリの中身を見たり、どうしてこう書くのかについても丁寧に触れられていた
    • プログラミング自体初学者という方は、考え方などとても参考になるのではないかと思いました。新卒1,2年目の時に出会いたかった…。

気になった点(強いて言えば程度ですが)

  • pdfの表記崩れが多々あった
    • 一部目次のインデントが崩れていたり、脚注が機能していないことがちらほら
    • 基本困らないのですが、一箇所だけ困ったこともあリマした。第12章ユーザー認証 12-2 IDトークンを取得するの中でリクエストするurlが見切れており、必要なパラメータが足りなくてIDトークンを取得できず、解決させるまで少し時間がかかりました。
      • 本の記載:https://accounts.google.com/o/oauth2/v2/auth?client_id=xxx.apps.googleusercontent.com&response_type=id_token&scope=openid profile&redirect_uri=http://localhost:8080/callbac
      • 成功したリクエスト:https://accounts.google.com/o/oauth2/v2/auth?client_id=xxx.apps.googleusercontent.com&response_type=id_token&scope=openid profile&redirect_uri=http://localhost:8080/callbac**k&nonce=11111**
        • callbackで終わりかなと思っていたため
    • 私の環境(Macのプレビューで開いていた)の問題の可能性もある…?
  • apiリポジトリ内のパッケージ管理方法に関して(この本、というよりはGoについての疑問)
    • ハンズオンの中で作ったものはパッケージごとに「github.com/yourname/reponame/models」という形でgithub上の自身が作ったリポジトリ内のコードを参照するようになっているが、参照元参照先どちらも変更する時など、ローカルファイルを向いていないと開発しづらいように思える
    • なので自分はexample/api/models のようにしてディレクトリを参照するようにアレンジしてしまっていた。Goでは一般的なやり方ではなかったりする…?
    • ディレクトリ構成に関してはおそらく入門の部類として説明が割愛されていたが、イントロダクションの章で文法など入門の内容に触れられている箇所はあったので、そこで少し触れられていると有難かったかもでした

本の中で作ったものの紹介

最小限機能要件を満たした動くもの+リファクタリング+ミドルウェアの追加、という変遷で、最終的に以下のようなものが出来上がります。

機能としては、5つのエンドポイントを持つブログAPIを作成します。

  • ブログ記事投稿
  • 一覧取得
  • 詳細取得
  • いいね押下
  • コメント投稿

構成は以下の4層構造になります。

  • controllers
    • 複数のハンドラ関数とハンドラ関数内で使う処理を含んだもの。リクエストに応じてハンドラを渡す
  • services
    • リポジトリとハンドラを繋ぐ処理を定義する
  • repositories
    • DBへ実行するクエリを定義・実行し、サービス層へ結果を返す
  • models
    • 取り扱うデータの構造体(今回はArticle, Comment)を定義する

プラスで、以下のようなミドルウェアを作って後からAPIに組み込みました。

  • router
  • error handler
  • logging
    • ログ出力を行う。traceIDとエラーコードを合わせて出力する
  • auth
    • OpenID Connectの IDトークンを使ってSSOに対応

このミドルウェア作成の中でゴールーチンやcontextパッケージの取り扱いなども学べるようになっており、手厚いです。またunittestもcontroller, repositories, service層でそれぞれ実装します。

自分の最終成果物は以下に置きました。

https://github.com/reiichii/go-intermediate-log

余談ですが、この本ではrouterにgorilla/muxというサードパーティ製ライブラリが使われているのですが、つい最近2022年12月にアーカイブされているのでそこだけ注意が必要かもです。

Discussion