2020年1月に購入し、途中ずっと積んでたんだけど、半年後ようやく再開し完走しました(^_^;)
以下のような"動く"アプリケーションをハンズオンで作成していきます。Webアプリケーション開発と名うってますが、CUIの作成もあります。
- WebSocketを使用した双方向チャットアプリケーション
- ドメイン生成サービス (CUIで実際に類語検索やwhois APIを使用して入力したキーワードからドメインを生成するツール)
- Twitter ストリーミングAPIを使用したキーワード集計アプリケーション(任意のキーワードが含まれるtweetのtweet数をリアルタイムに集計する)
- 指定場所範囲内のスポット検索アプリケーション(google place apiを使用したランドマーク検索アプリ)
- 指定フォルダ内の更新をキャッチしてバックアップを行うバックアップアプリケーション
こうして羅列するとページ数の割には結構なボリュームでした。
syntaxは読者が知っている前提で進んでいくので基本的な文法は予め少し予習しておいた方が進めやすいです。とはいえ、それほど難しい文法はなかった。どちらかというと、どのファイルのどのメソッドがどういう挙動をするか?という設計を把握するほうが大変。
僕のGoの知識はTour of Goを完走している程度。ただ、かなりsyntax忘れたので都度、調べながら手を動かしていた(^_^;)
良かった点
- 動くアプリケーションを作成するのはやっぱり楽しい。
- 外部のAPIやMongoDBの利用を行うアプリケーションがあり実践よりなGoアプリケーション開発が学べる。
- goroutine、akkaより手軽で楽しい(^_^)
- mainプログラムを分割することで、ちょっとしたマイクロサービス的な役割の最初の1歩なんかを踏み出すことができる。特にTwitter投票アプリなんかは4つの独立した各アプリケーションで構築される。
- ちょっとしたユニットテストの書き方も学べる。Goの場合、"ユニット"テストと呼ぶかは定かではないけど。
イマイチな点
- テスト駆動開発的なワードが書籍中に紹介されるんだけど、それにしてはテストについての扱いは淡白。
- 僕の頭では各分割されたプログラムの各役割を理解して、それを脳内でシーケンスに落とし込むのに結構な時間がかかった。特にチャットアプリケーションなんかは理解するのに時間がかかって、2回ほど写経を行ってしまった(^_^;)
- ハンズオンといっても、最初にロジック層から記述し、最後にmain層といった順序で実装するので、"動かす"までに時間を要するアプリケーションも存在する。
ハマった点
書籍出版から時間が経過し、書籍通りでは動かなかった点
- go-nsqはbitlyからnsqioに移動している。
- go-nsqはDockerで構築していたので、lookupdからのnsqdのアドレス取得でコンテナIDが返されハマった。
nsq.NewConsumer("topic", "key", nsq.NewConfig()).ConnectToNSQLookupd("localhost:4161")
— Fumiya Ichikawa (@LET__IT__RIDE) July 6, 2020
した時、
error connecting to nsqd - dial tcp: lookup d483db86bc41: no such host
DockerのコンテナIDが返ってくるんだけど、多分、nsqdからサブスクライバのホストが返されるわけか...
そういえば、昨日はまった件、DockerのコンテナIDを/etc/hostsに記載して127.0.0.1に名前解決してあげるといけた気がしないでもない。
— Fumiya Ichikawa (@LET__IT__RIDE) July 7, 2020
- google place apiはAPIプロジェクトに対して請求先アカウント情報の紐付けを行わないと、有効データを返さない。コンソール上はエラー率が100%になるが、コンソールからもAPIからもエラーの内容が返されない(僕の確認不足かもしれないが)ので、解決するのに時間がかかった。
- JSONのパース時に構造体のフィールド名を省略したような記載だったが、僕の環境でコンパイルは通るがランタイムエラーとなり、フィールド名も記述してパースを通した。
google place api、ダブルでハマってる...
— Fumiya Ichikawa (@LET__IT__RIDE) July 10, 2020
1つ目は請求アカウントを登録しておかないと、HTTPレスポンスは200OKだけど、Bodyが何も帰ってこない。
2つ目はJsonのデコードがうまく行かない...これはプログラムの問題なんだけど、unexported field だけでどのキーのバインドがおかしいかがわからない
おk。パースできた。書籍ではJSONオブジェクトのパース時に、構造体のフィールド名省略してるけど、現在はフィールド省略するとコケるっぽい。請求アカウントの件含めてハマった。
— Fumiya Ichikawa (@LET__IT__RIDE) July 10, 2020
やっぱりアプリケーションの作成は楽しいので、Go2冊目の書籍にはぴったりの本ではないのかな。と思いました。