読者です 読者をやめる 読者になる 読者になる

まっしろけっけ

めもてきなやーつ

golangのフレームワークkochaを使ってみた その1

経緯

golangを学習し始めて2週間〜3週間くらい、
ちょっとわかってきたので
そろそろフレームワーク使ってみたいなと思い調べ始めた。
ちなみにgolangの学習は下記のページや書籍など

A Tour of Go
web上でさくっと出来る

Effective Go — プログラミング言語 Go ドキュメント v0.1 documentation
ドキュメントてきな

Go For Perl Mongers
すごくためになった

taizo - Qiita
会社の先輩のqiita初心者がつまずく点がいっぱいまとまってあった

Amazon.co.jp: 基礎からわかる Go言語: 古川 昇: 本
基本的なことはこれ読めばわかる気がする

kochaを選択した理由

Kocha web application framework for Go

サンプルをチラっと見た感じだとRailsっぽいじゃんという理由で要はなんとなくです。
強いて言うならRails好きだからです。ちなみに和製らしいです。

ほかにもmartini,revelあたりは使ってみようと思っているので後々記事を書くかもしれない。

serverを立ち上げる

$ go get github.com/naoina/kocha

これでkochaを取得してくる

$ go get github.com/naoina/kocha/cmd/...

これでkochaコマンドが使える

今回はアプリケーション名をexample-kochaで作成します。
※GOPATH部分は各自の環境によってかわります。

$ kocha new example-kocha
    create directory /GOPATH/src/example-kocha/app/controller
              create /GOPATH/src/example-kocha/app/controller/root.go
    create directory /GOPATH/src/example-kocha/app/view/error
              create /GOPATH/src/example-kocha/app/view/error/404.html.tmpl
              create /GOPATH/src/example-kocha/app/view/error/500.html.tmpl
    create directory /GOPATH/src/example-kocha/app/view/layout
              create /GOPATH/src/example-kocha/app/view/layout/app.html.tmpl
              create /GOPATH/src/example-kocha/app/view/root.html.tmpl
    create directory /GOPATH/src/example-kocha/config
              create /GOPATH/src/example-kocha/config/app.go
              create /GOPATH/src/example-kocha/config/routes.go
              create /GOPATH/src/example-kocha/main.go
    create directory /GOPATH/src/example-kocha/public
              create /GOPATH/src/example-kocha/public/robots.txt

初めてrails newした時と同じ気持ちを味わえましたね!

serverを立ち上げる

$ cd /GOPATH/src/example-kocha
$ kocha run
kocha: you can be setting for your app by the following environment variables at the time of launching the app:

    KOCHA_ADDR="127.0.0.1:9100"

Starting...

Listening on 127.0.0.1:9100
Server PID: xxxxx

これでhttp://127.0.0.1:9100/にアクセスすると
「Welcome to Kocha」が表示されると思います。

処理の流れをざっくりと追う

config/routes.go内で下記のようにrouting周りの記述されている。
routingを追加する場合はここに追記する感じになるっぽい

var routes = RouteTable{
        {
                Name:       "root",
                Path:       "/",
                Controller: &controller.Root{},
        },
}

Path(今回の場合は/)へのアクセスの際にControllerに格納された各controllerを呼ぶ。

Controllerのinterfaceがどのようになっているのかは下記を参照
https://github.com/naoina/kocha/blob/master/controller.go#L27-L64

HTTPの各methodでcontroller側のどのmethodを呼ぶかを解決しているのが下記
https://github.com/naoina/kocha/blob/master/router.go#L93-L121

今回の場合はapp/controller/root.goが対象のcontrollerになり
GETでアクセスしているので下記のmethodが呼ばれる。

func (r *Root) GET(c *kocha.Context) error {
        return c.Render(map[string]interface{}{
                "ControllerName": "Root",
        })
}

表示されているviewはapp/view/root.html.tmpl

ざっくりしすぎですがこんな感じ

今後

controller, model周りの実装もあるのですが
長くなりそうなのでその2にて書いていきます。

kochaのソースを読むと構成とかとても勉強になる
間違いがあればご指摘いただけますと幸いです。