Skip to content

Instantly share code, notes, and snippets.

@voluntas
Last active April 6, 2017 17:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save voluntas/1c53adbfbfccfbe1ff9c7b212dea8c65 to your computer and use it in GitHub Desktop.
Save voluntas/1c53adbfbfccfbe1ff9c7b212dea8c65 to your computer and use it in GitHub Desktop.

Golang でウェブアプリコトハジメ

方針

  • echo をベースに作っていく
    • echo 自体が薄いラッパーなので、それにもう一枚プロジェクト用のラッピングをする
  • 機能毎にコードは分けてしまってイイ
    • データベースをどう扱うべきかは後で考える
    • model は共通化、アプリは分けるでもいいのかも
  • データベースの状態は model に押し込める
  • model は struct で生やして、そこにメソッドを生成していく
    • struct User つくって User.GetUserById(id) みたいな感じで取得できるようにする
  • ミドルウェアを上手く使う
    • user/session ここに色々押し込めていく

フォルダ構成

とりあえず echo-web というサンプルをベースに考えてみたが、これが正しいかはわからない

  • middleware
    • auth
      • auth.go
    • session
      • session.go
  • model
    • model.go
    • db.go
    • user.go
  • router
    • api/

      api.go

    • router.go
  • template
    • template.go
  • conf.go
  • echo.go

サンプル

package main

import (
        "net/http"

        "github.com/go-pg/pg"
        "github.com/go-pg/pg/orm"

        "github.com/labstack/echo"
        "github.com/labstack/echo/middleware"
)

type User struct {
        Id     int64
        Name   string
        Emails []string
}

func index(db *pg.DB) echo.HandlerFunc {
        return func(c echo.Context) error {
                var users []User
                err := db.Model(&users).Select()
                if err != nil {
                        panic(err)
                }

                return c.JSON(http.StatusOK, users)
        }
}

func main() {
        db := pg.Connect(&pg.Options{
                User: "postgres",
        })

        err := createSchema(db)
        if err != nil {
                panic(err)
        }

        err = db.Insert(&User{
                Name:   "admin",
                Emails: []string{"admin1@admin", "admin2@admin"},
        })
        if err != nil {
                panic(err)
        }

        err = db.Insert(&User{
                Name:   "root",
                Emails: []string{"root1@root", "root2@root"},
        })
        if err != nil {
                panic(err)
        }

        e := echo.New()

        e.Use(middleware.Recover())
        e.Use(middleware.Logger())
        e.Use(middleware.Gzip())

        e.GET("/", index(db))

        e.Logger.Fatal(e.Start(":5000"))
}

func createSchema(db *pg.DB) error {
        err := db.CreateTable(&User{}, &orm.CreateTableOptions{
                Temp: true,
        })
        if err != nil {
                return err
        }
}

利用ライブラリ

参考

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment