あいつの日誌β

働きながら旅しています。

gin 入門(1)

あらすじ

Go 言語の WEB フレームワークである gin を使って WEB API の作り方を調べたのでまとめようと思います。

お断り

たぶん全5回ぐらいの内容になると思うのですが、ちょっとまだ記事まとめ中なので、この記事自体をちょいちょい修正します。

完成したら github あたりで公開します。

準備

% mkdir ~/gocode/src/github.com/okamuuu/gin-tutorial && cd $_
% mkdir server worker shared

create server/main.go:

package main

import "github.com/gin-gonic/gin"

func main() {
    r := gin.Default()
    r.GET("/ping", func(c *gin.Context) {
        c.String(200, "pong")
    })
    r.Run(":8080") // listen and serve on 0.0.0.0:8080
}

サーバー起動

% go run server/main.go

動作確認テスト。xargs echo にパイプしているのは改行コード追加したいだけなんですが curl にそういうオプションないのでしょうか(調べろ)

% curl -s localhost:8080/ping | xargs echo
pong

ORM を準備

create shared/db.go:

package shared

import (
    "database/sql"
    "github.com/coopernurse/gorp"
    _ "github.com/go-sql-driver/mysql"
    "log"
)

type Article struct {
    Id      int64  `db:"id" json:"id"`
    Title   string `db:"title" json:"title"`
    Desc    string `db:"desc" json:"desc"`
    Created int64  `db:"created" json:"created"`
}

func checkErr(err error, msg string) {
    if err != nil {
        log.Fatalln(msg, err)
    }
}

func NewDbMap(dsn string) *gorp.DbMap {
    db, err := sql.Open("mysql", dsn)
    checkErr(err, "sql.Open failed")
    return &gorp.DbMap{Db: db, Dialect: gorp.MySQLDialect{"InnoDB", "UTF8"}}
}

func CreateTablesIfNotExists(dbmap *gorp.DbMap) {
    dbmap.AddTableWithName(Article{}, "articles").SetKeys(true, "Id")
    err := dbmap.CreateTablesIfNotExists()
    checkErr(err, "Create table failed")
}

create shared/db_test.go:

package shared

import (
    "github.com/coopernurse/gorp"
    "testing"
)

var dsn = "root:@tcp(127.0.0.1:3306)/test_db"

func TestSomething(t *testing.T) {
    dbmap := NewDbMap(dsn)
    CreateTablesIfNotExists(dbmap)
    defer dropAndClose(dbmap)
    rows, _ := dbmap.Select(Article{}, "SELECT * FROM articles")
    if len(rows) != 0 {
        t.Errorf("Expected 0 invoice rows, got %d", len(rows))
    }
}

func dropAndClose(dbmap *gorp.DbMap) {
    dbmap.DropTablesIfExists()
    dbmap.Db.Close()
}

テストを実行します。あらかじめ mysql start と test_db を作成する必要があります。

% go test shared/*.go
ok      command-line-arguments  0.042s

次回は server/*.go をテストする方法を考えます。