LoginSignup
8

More than 5 years have passed since last update.

GoでMySQL,Redisでアプリケーションを作ってみて詰まったことあれこれ

Last updated at Posted at 2018-04-13

はじめに

最近なんか新しい言語に触れてみたい!
そんな欲がだんだんと深まってきていた矢先Goと出会いました。
せっかく欲が出たんならと簡単なアプリ作ってみてデプロイまでをやってみたので、その過程で色々と詰まったことがあったのでそんなことをつらつらと書きます。

構成

出来たもの

:octocat: gtongy/demo-echo-app
:computer: demo app by echo

詰まったこと

:question:作業場所わからん。どこに置いたらいいのか

GOPATH は適当に決めて問題ない - Qiita」と「みんなのGo言語」を参考。
export GOPATH=$HOME/go_work
home directory配下にgo_workというディレクトリを作ってその下に

.
├── bin
├── pkg
└── src
    └── github.com
        └── gtongy
            └── demo-echo-app

のように配置して実装を行った。作業ディレクトリの下は

  • bin
    • go getでインストールされた実行形式のファイルの置き場所
  • pkg
    • パッケージオブジェクトの置き場所
  • src
    • ソースコードが記述された置き場所。ここで主に作業を行う。

となってます。

:question:テンプレートってどう呼び出す?

ほとんど公式通り。
Renderにデータ付きのテンプレートを食わせてやると、ステータスコード付きのresponseを返してくれる。
template.Must(template.ParseGlob("templates/*.tpl"))でtplファイルのパース時のerrが起こった時にpanicを起こすようにするラッパーを介してEcho.Contextにtplファイルを入れ込んでhandler側でごにょごにょすると画面にテンプレートを描画できる。

// テンプレート描画用の構造体
type TemplateRenderer struct {
    templates *template.Template
}

// データ食わせてテンプレートを表示させるとこ
func (t *TemplateRenderer) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
    return t.templates.ExecuteTemplate(w, name, data)
}

func main() {
  renderer := &TemplateRenderer{
    templates: template.Must(template.ParseGlob("templates/*.tpl")),
  }
  e.Renderer = renderer
  c.GET("/login", c.Render(http.StatusOK, "form",   map[string]interface{}{
        "csrfToken": csrfToken,
  }))
}

ちなみに、テンプレート側で共通のファイルとかあるけど、それもはじめに全て使用分のテンプレートをRenderしておけば呼び出しも比較的楽に出来た。

:innocent: あれ...自分で作った他packageの関数とかメソッド参照出来ないんだけど...

Go言語のアクセス許可のこと何にもわかってなかったためつまづいた。
パッケージ外へのアクセスを許可させる時は関数なりメソッドの先頭を大文字にしないと参照が出来ない。
地味にここで呼び出しが出来なくてハマって辛い。
以下の記事に巡り合って解決したので感謝です。

Go言語での構造体実装パターン · THINKING MEGANE

:innocent: んん...?gormでmysqlをSELECTする時にScan error出てきたぞ...

以下記事がまさにその問題で助かりました :bow:

GolangでScan errorが出た時の対応 - Qiita
Scanするときの時間の型とstructの型が違うことでエラーを吐いてたみたい。

:question: Redisがローカルで動くのはいいけど、herokuでどうRedis参照させたらいいんだろう?

こちらの記事を参考にさせていただきました :bow:

ローカルで開発する時はNewRediStoreで接続してたんですが、herokuの設定がURLの形式で吐き出されるのを変換するところでハマりました。
記事の通りですが、NewRediStoreで接続していたところをNewRediStoreWithPoolで接続させれるようにするために、内部でredis.Conn => redis.Poolに変換させてNewRediStoreWithPoolでインスタンスを生成させるようにしています。

:question: そういえばsessionってどうやって破棄するんだ?

有効期限切れの設定をセッションに上書きして保存させることで破棄。

session.Options = &sessions.Options{MaxAge: -1, Path: "/"}
session.Save(c.Request(), c.Response())

go - gorillaでセッションを破棄(削除)する方法を知りたい - スタック・オーバーフロー
build-web-application-with-golang/06.2.md at master · astaxie/build-web-application-with-golang · GitHub

まとめ

様々な記事に助けられ色々とつまづきはしましたが、Goの入門の壁を叩いてみました。
言語自体はすごくシンプルだけど型もある程度の縛りはもうけられているのが安心感も強いなと感じました。そして何よりも実行速度の速さが驚き。
それと抽象的な構造を先に決めておいてその振る舞いを構造体にメソッドとして生やしていく感覚がコード書いてる時は楽しかったりもしていて。
感想をあげだすと結構ポジティブな印象が強い言語で個人的にはハマりそうな予感を感じていました。
入門として入ってみるとなかなか面白い言語だと思うので、これから新しくどんな言語学ぼうかなーって悩んでる人は選択肢の一つとしてGoで遊んでみてもいいかも。

参考文献

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8