「詳解Go言語Webアプリケーション開発」読書感想&メモ
GolangにおけるWebアプリケーション開発で知っておくべきことを薄く広く知れれば良いなと思い本書を手に取った。
私の現在のステータスは、
- フロントエンド中心のWebエンジニア5年目
- A Tour of Go、Gopher Dojo、他の書籍などで基本文法は理解している
- 実務でちょっと書いたことがある
といった感じ。
CHAPTER 01
Goが誕生した背景や「Goに入ってはGoに従え」といった有名な話のおさらい。
「Effective Go」とか「Go Code Review Comments」は知らなかったので後で見てみる。
CHAPTER 02
感想
「context」の話。
基本文法の説明等はなくコード例にいきなりゴルーチンとかが出てくるので、これから読む人は別の書籍や Gopher Dojo とかで基本文法は先に押さえておくことをおすすめする。
知っていればコード例もわかりやすくて良い。
メモ
Contextの役割としては、
- キャンセルやデッドラインの伝播
- メタデータを関数やごルーチン間で伝達させる
contextでリクエストのキャンセルや切断を受け取るような実装になっている。
大抵のライブラリ・パッケージが第一引数で受け取るようになっているのはこのため。
そのため、作るアプリケーションのハンドラ内で *http.Request の値から取得した context を受け渡し続けるようにする。
他にもトレースやメトリクスなどの計測を行うときに context に値を入れて伝播させることができる。
CHAPTER 03
感想
「database/sql」の話。
冒頭にデーターベースの公式チュートリアルとドキュメントへのリンクが置いてあるのが良い。
個人的に求めている物が公式から発展したよくある使い方や、思想の解説だったので公式でわかることは公式に飛ばされるのが良かった!
コラムに書かれている標準パッケージやOSSのリーディング方法としておすすめされている「pkg.go.dev」を読むというのをやってみた感想としては、他の言語に比べてはるかにOSSリーディングがしやすい言語だと感じた。このあたりはすごく快適。
メモ
database/sql パッケージには XxxContext と Xxx メソッドがあるが、Xxxは後方互換を保つ物なので XxxContext を基本は使用すれば良い。
標準パッケージの database/sql を理解しておくことは大切だが、基本的にはOSSを使用する。
CHAPTER 04
感想
可読性のお話し。
exported/unexported の話は知っていたのですんなり理解できたが、別言語から入ってきた人は最初ハマりそうだなとは思った。
メモ
internal という特別なパッケージがある。internal にすると、一つ上の階層とそれ以下のパッケージがアクセスできる。
CHAPTER 05
感想
「Go Modules」のお話し。
Go Modulesがリリースされた2019年はJS/TSしか書いていなかったので、Go Modulesは噂で「Goにすごい良い機能が入った」と聞いていたぐらいなので懐かしい気分になった。
今は基本的にGo Modulesを使用するとのこと。
セマンティックバージョニングなどは他の言語と同じだが、パッケージのバージョン管理はGo特有の設計もあるのでそのあたりは気をつける。
依存先のOSSにデバッグコードを埋め込む方法が解説されているのは結構助かる!
(開発してるとやりたくなることがかなりあるので)
メモ
v2
などのバージョンがディレクトリにきられている時はコード上でもその呼び出し方だが、go.mod にバージョン名が書かれている場合は module名でインポートする。
よく使うコマンド
-
go mod init
- 新しくGoのパッケージやアプリケーションを作成する
-
go get -u
- パッケージの更新
-
go mod tidy
- go.mod, go.sum ファイルから余計な記述を削除してきれいにする
CHAPTER 06
感想
Goとオブジェクト指向プログラミングのお話し。
オブジェクト指向自体は割と解釈が異なるので、あまり用語に囚われずにGoとしての機能に注力して考えていきたい。
Goには埋め込みがあるが、これが継承ではないというのはその通りだと感じた。
CHAPTER 07
感想
インターフェースのお話し。
暗黙的なインターフェースは最初見たとき結構びっくりした機能で、あまり納得感が得られていないところでもあったので詳細な解説がされていて良かった。
CHAPTER 08
感想
エラーハンドリングのお話し。
「エラーはただの値である」という表現はまさにそうだなと感じた。
このあたりのエラーを値として扱う手法はTypeScriptでもResult型に近い物があるので、割とすんなり溶け込めた。
IDEの補完呼び出し方法まで書いてあるのは親切。
メモ
エラーオブジェクトを比較するときは errors.Is
を使用する
独自パッケージで特定のエラー状態を識別したい場合、パッケージスコープの変数として error の値を定義する
CHAPTER 09
感想
無名関数・クロージャのお話し。
このあたりの通常の挙動は他言語と大体同じなのですんなり受け入れられた。
ゴルーチンはGo独特の機能なので利用時は気をつける必要がありそう。
CHAPTER 13~
ハンズオン。内容が充実していて良かった。
テスト・モック・認証/認可まで一通り網羅されているので、実際に書いてみて得られる学びがかなり大きかった。