Go echo を使ってみる
特徴
- リソース量に比例して全体のスループットが向上する設計
- スケーラブルなフレームワークまたREST API向け
- Ginを超える程の高速処理
- RESTAPI向けに最適化されているフレームワーク
- スタンダードなHTTPサーバで動作する
- URI(PATH)単位でなにか処理を入れられる
- ミドルウェアに対して拡張性がある。
- urlごとにログ出したり出さなかったりすることできる
- JSON,XML,フォームペイロードなどへのデータバインディングのサポートがある
- HTTPの様々なレスポンスを送るための使いやすい関数をサポート
- どんなテンプレートエンジンででもテンプレートレンダリングできる
- Loggerに対して任意の定義を行える
install
go get github.com/labstack/echo go get github.com/dgrijalva/jwt-go
./main.go
goって package が main のやつがないと起動しないんですね…
package main import ( "github.com/labstack/echo" "github.com/labstack/echo/middleware" "./handler" ) func main() { e := echo.New() e.Use(middleware.Logger()) e.Use(middleware.Recover()) e.GET("/", handler.MainPage()) e.Start(":8080") }
/handler/handler.go
package handler import ( "github.com/labstack/echo" "net/http" ) func MainPage() echo.HandlerFunc { return func(c echo.Context) error { return c.String(http.StatusOK, "Hello World!!!!") } }
起動
起動するとこんな感じ. echoって感じですね.
▶ go run main.go ____ __ / __/___/ / ___ / _// __/ _ \/ _ \ /___/\__/_//_/\___/ v4.0.0 High performance, minimalist Go web framework https://echo.labstack.com ____________________________________O/_______ O\
アクセス
表示されます
▶ curl http://localhost:8080 Hello World!!!!%
ついでにDB周りも触って見る。
dbrというORMがあるらしい?
dbrって何ぞ?
golang の orm ですね。 サポートしているドライバーは下記の模様
- MySQL
- PostgreSQL
- SQLite3
今回は、というかいっつもMySQL使ってるのでMySQL使います。
dbr install
▶ go get -u github.com/gocraft/dbr
データ作成
mysql> create table user( -> id varchar(36) not null, -> name varchar(50) not null, -> email varchar(128) not null, -> primary key(id)); Query OK, 0 rows affected (0.02 sec) mysql> insert into user (id, name, email) values ('D7EEFCBD-CD03-4524-893A-4850D9828D57', 'kusobutayarow', 'kusobutayaro-w@hogehogehogeho.jp'); Query OK, 1 row affected (0.01 sec) mysql> select * from user; +------------------------------------------------+----------------+---------------------------------------+ | id | name | email | +------------------------------------------------+----------------+---------------------------------------+ | D7EEFCBD-CD03-4524-893A-4850D9828D57 | kusobutayarow | kusobutayaro-w@hogehogehogeho.jp | +------------------------------------------------+----------------+---------------------------------------+ 1 row in set (0.00 sec)
main.go 修正
package main import ( "github.com/gocraft/dbr" "github.com/labstack/echo" "github.com/labstack/echo/middleware" "./handler" _ "github.com/go-sql-driver/mysql" "net/http" ) type ( user struct { ID string `db:"id"` Email string `db:"email"` Name string `db:"name"` } ) var ( tableName = "user" seq = 1 conn, _ = dbr.Open("mysql", "root:@tcp(127.0.0.1:3306)/hogehogehogeho", nil) sess = conn.NewSession(nil) ) func selectUser(c echo.Context) error { var m user name := c.Param("name") sess.Select("*").From(tableName).Where("name = ?", name).Load(&m) return c.JSON(http.StatusOK, m) } func main() { e := echo.New() e.Use(middleware.Logger()) e.Use(middleware.Recover()) e.GET("/", handler.MainPage()) e.GET("/user/:name", selectUser) e.Start(":8080") }
実行.
取得成功
▶ curl http://localhost:8080/user/kusobutayarow | jq { "ID": "D7EEFCBD-CD03-4524-893A-4850D9828D57", "Email": "kusobutayaro-w@hogehogehogeho.jp", "Name": "kusobutayarow" }
無事取れた. ※jqコマンドに関してはこちら > https://stedolan.github.io/jq/
所感
- 最初にbeegoを触ったからか、すごいシンプルだなぁという印象を受けました。
参考: refer