golangでrest api (web framework iris and orm gorm)試してみた

golangのweb frameworkはまだスタンダードが決まってないようで候補はいろいろ

この中で最もパフォーマンスがよいといわれているiris試すことに

ormもいろいろあるようですが全部入りのgormを選択

databaseは前回用意したmysqlで以下のようになりました

package main

import (
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
    "github.com/kataras/iris"
    "time"
)

func main() {
    connectionString := "user:pass@tcp(xxx.arukascloud.io:0000)/db?charset=utf8&parseTime=True&loc=Local"
    db, err := gorm.Open("mysql", connectionString)
    if err != nil {
        panic(err)
    }
    db.AutoMigrate(&Article{})
    ar := &ArticleResource{db: db}

    iris.Get("/articles", ar.ArticlesList)
    iris.Post("/articles", ar.ArticlePost)
    iris.Get("/articles/:id", ar.ArticlesDetail)

    iris.Listen(":8080")

}

type ArticleResource struct {
    db *gorm.DB
}

type Article struct {
    Id      int64 `gorm:"AUTO_INCREMENT;primary_key"`
    Created int64
    Title   string
    Content string
}

func (ar *ArticleResource) ArticlesList(c *iris.Context) {
    var articles []Article
    ar.db.Order("id").Find(&articles)
    c.JSON(iris.StatusOK, articles)
}

func (ar *ArticleResource) ArticlesDetail(c *iris.Context) {
    id := c.Param("id")
    article := Article{}
    ar.db.First(&article, id)
    c.JSON(iris.StatusOK, article)
}

func (ar *ArticleResource) ArticlePost(c *iris.Context) {
    var json Article
    c.ReadJSON(&json)
    article := Article{
        Created: time.Now().UnixNano(),
        Title:   json.Title,
        Content: json.Content,
    }
    ar.db.Create(&article)
    c.JSON(iris.StatusCreated, article)
}

同じことをrubysinatraでしたらコード量は減るけどパフォーマンスは圧倒的にこちらの方がよいかと