ほげほげほげほ

ただのメモ置き場です。基本的にプログラム関連のメモ。

Go echo を使ってみる

f:id:kusobutayarow:20190323205109j:plain

特徴

  • リソース量に比例して全体のスループットが向上する設計
  • スケーラブルなフレームワークまた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

dbrって何ぞ?

golang の orm ですね。 サポートしているドライバーは下記の模様

今回は、というかいっつも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