kazu22002の技術覚書

PHPer, Golang, AWS エンジニアの日々

「Go言語によるWebアプリケーション開発」3章 プロフィール画像を追加する3つの方法

Go言語によるWebアプリケーション開発

Go言語によるWebアプリケーション開発

3章は、1,2章のチャットアプリケーションにプロフィール画像を追加して、エクスペリエンスを向上させるようプログラムを追加します。

かなり実践的な内容になっており、作成していても理解しながら作るのが大変になりました。

この本はTDDを重視しながら実装を行っています。プログラムが複雑になってきたため、テストを書くケースが多くなりより難しくなっている印象でした。

チャットにアイコン付与

まずチャットの文言だけでなく、アイコンを追加することでわかりやすくユーザーを判別できるようにしています。

アイコンの取得について、3パターンの実装が行われています。

  • 認証サービスのアイコン
  • Gravatarのサービス利用
  • 自前サービスで管理

認証サービスのアイコン利用はかなりありがたいですね。自前で管理しなくてもサービスが作れるというのは、考えることが少なくできるので、よりシンプルにできると思います。

この章では、UIを良い方向で変える手段をいろいろと提示してくれています。

リファクタ

TDDを重視しているため、よりコードをわかりやすくする取り組みも実感できます。

書き方で驚いたのは、構造体の宣言で配列を利用した方法です。

type Avatar interface {
    GetAvatarURL(ChatUser) (string, error)
}

type TryAvatars []Avatar

func(a TryAvatars) GetAvatarURL(u ChatUser) (string, error) {
    for _, avatar := range a {
        if url, err := avatar.GetAvatarURL(u); err == nil {
            return url, nil
        }
    }
    return "", ErrNoAvatarURL
}

type AuthAvatar struct{}
var UseAuthAvatar AuthAvatar
func (_ AuthAvatar) GetAvatarURL(c ChatUser) (string, error) {
    url := c.AvatarURL()
    if url != "" {
        return url, nil
    }
    return "", ErrNoAvatarURL
}

これは感心しました。構造体を作成すれば、配列でも関数を追加した構成にできるのは驚きました。確かに書いてみればできると思えます。

またこれを利用して、実装をあまりかえず、3パターンのアイコン表示を実現しているコードには感動しましたね。

やっぱりまだ知らないことがいっぱいありますね。

画像アップロード

画像アップロードのプログラムもこの章で学べます。

ファイルのアップロードってこんなに簡単だったっけ?と、作ってからいろいろと見直してしまっています。

「filepath.Join」「filepath.Ext」の関数を知ることができたのは、いい収穫になりました。

自分でパースして書いた記憶があるので、書き直してみたいと思います。

つまったこと

go getで足りない部分があり、少し詰まりましたが、実装できましたね。

このあたりはdepかgo modulesで書いておきたいです。このあたりの運用は決定版が出て欲しいです。

その他、個人的に実装してみたこと

設定ファイルをtomlで管理し、keyをバージョン管理外にしました。

googleの認証のClientIdとSecretKeyをバージョン管理に含めたくなかったため、変更してみました。

github.com/BurntSushi/tomlを利用して、tomlファイルでの管理にしました。

github.com

簡単ですね。

コードの書き方でいい刺激に

コードを写経するだけでかなり時間がかかっていますが、いい刺激になっています。

知らないこと、活かしてみたいことに気づけている実感があるのがいいと思っています。

goのマニュアルを読んだつもりですが、もう一度読んだほうがいいかな。と思います。

次は「ドメイン名を検索するコマンドラインツール」です。

いままでの章とは違う感じになりそうです。