update.モチベーションここ半年以上Revelが死んでいるので折を見て移行したかった未熟なGopherとしてRevelの充実した機能に乗っかり続けることへの危機感があった移行するアプリ個人で作っているplayground的プロジェクトコードベースはそれほど大きくない簡単なcontrollerが5つくらいクーロンjobとlogger以外はRevel標準の仕組みを使用かといってRevelにズブズブというわけでもない小さいアプリなのでRevelの基本的な機能しか使っていなかったechoを触り始めて数日で書いているので勘違い(echoにこういう機能はない、とか)あるかもしれない。frameworkを標榜するechoでは自分で記述を追加する部分が多かった印象(良く言えばカスタマイズ性が高い)。ホットリロードBEFORErevelがデフォルトでやってくれていた。AFTERechoにはない。いちいちビルドするのもさすがに面倒なのでgodoというGo製タスクランナーを使う。JavascriptでいうところのGulpという認識。https://github.com/go-godo/godoアプリは以下のようなディレクトリ(appディレクトリ)で開発している。gohtmlファイルの変更をwatchさせる。中に.gohtmlファイルmain.goappディレクトリ直下にGododirというディレクトリを作成し、その中にmain.goファイルを作成する。ホットリロードができればいいのでシンプル。-wコマンドを実行すればok注意点としてはファイル名パターンの指定でカンマ,の後にスペースを空けるとgohtmlファイルの変更が認識されなくなる。gohtml}")参考Docker内のGo製Webアプリをソース変更後リロードするだけで確認できるようにするコンフィグBEFORERevelのapp.confファイルに記述。https://revel.github.io/manual/appconf.htmlAFTERechoにはない。前に見つけて良さそうと思っていたviperを使用することにした。productionごとの設定値、環境変数まで一緒くたに書ける便利さがあった反面、ただ順番に値を書いていくだけ、階層構造も(たぶん)作れなかったので気持ち悪さのようなものがあった。あとRevel側で使用する設定もいろいろあってごちゃごちゃしていた。viperはymlなりjsonなり好きな記法で階層構造を作って設定を記述できるのが良く、値を取り出す処理もシンプルでいい。structを作っていた。c.RenderTemplate("home/index.gohtml")}AFTERRevelではcontrollerと呼んでいたがGoっぽくhandlerと呼ぶことに。nilとなってもそのエラー内容はどこも表示してくれない。)Revelでは丁寧にエラーを表示してくれていたがechoは以下のメッセージをブラウザに表示するだけだった。Error"}なのでこのようなラッパーを作って各handlerから使うようにした。err}echoのエラーハンドリングについてエラーをどこも表示してくれないのでラッパーを作った、という点に関してコメントで指摘をいただいたので追記。echoではhandlerが返すエラーがnilでなかったときecho.HTTPErrorHandlerを呼んでエラーハンドリングしている。https://github.com/labstack/echo/blob/master/echo.go#L531HTTPErrorHandlerにはデフォルトでDefaultHTTPErrorHandlerがセットされる。Error"}しか表示されないと書いたがそれはDefaultHTTPErrorHandlerが返していたものだった。DefaultHTTPErrorHandlerは詳細なエラー内容を表示してくれないのでラッパーを作ったがそれよりはHTTPErrorHandlerをカスタマイズしたほうがいいのだろう。handlersとある通り、ラッパーを作るのはエラーハンドリングを一箇所に集約しているechoの構成に反している。そもそもラッパーを作っても裏ではHTTPErrorHandlerが動いているので処理の重複になってしまっている。テンプレート一番移行に苦労した点。テンプレートファイルを入れているviewsフォルダは以下のような構成(各ハンドラに対応したディレクトリに分ける)をしている。viewshomeindex.gohtmlworkindex.gohtmlBEFOREcontrollerで階層を含めてファイル指定。c.RenderTemplate("home/index.gohtml")AFTER基本はechoのドキュメントに従う。定義した文字列と対応する。}}こういう名前をつける以外にも直接ファイル名で指定することもできる。この場合ディレクトリ階層を指定することはできないのでファイル名はviewsディレクトリ全体で一意にする必要がある(と思う)。Functionを使用https://revel.github.io/manual/templates.html#CustomFunctionsAFTERテンプレートをパースするところに記述を追加する必要。definedRevelにデフォルトで入っていたfunctionで使いたいものはこのあたりを参考に移植したhttps://github.com/revel/revel/blob/master/template.go#L45セッションBEFORERevelにデフォルトで機能があるhttps://revel.github.io/manual/sessionflash.htmlAFTERechoにはデフォルトでない。ミドルウェアを使用https://github.com/ipfans/echo-sessionインターセプターRevelにあるコントローラの実行前後にメソッド実行を挿入できるやつBEFOREhttps://revel.github.io/manual/interceptors.htmlAFTERechoにはもちろんないがcontextのカスタマイズで対応できる(と思う)。