社畜エンジニアがおすすめする2023年トレンドのGo言語フレームワークまとめ

概要

現在、Go 言語を使用する開発者は増加しており、多くの開発者はフレームワークを使用することにより、より多くのアプリケーションを開発できるように注目しています。

様々な用途に適した Go 言語のフレームワーク が提供されていますが、自分自身が作成するプロダクトに最適なフレームワークを選択することは悩ましい課題です。

そこで、私が使ってみて優秀だと思う、かつ頻繁に使用する 6 つのフレームワークを紹介します。また、この記事では、2023 年において Go 言語のフレームワークを選定する際の参考になる情報を提供します。

おすすめフラームワーク一覧

nameGithubStar
Ginhttps://github.com/gin-gonic/gin54.8K
Revelhttps://github.com/revel/revel12.6K
Beegohttps://github.com/beego/beego27.6K
Irishttps://github.com/kataras/iris21.7K
Echohttps://github.com/labstack/echo21.5K
Fafiberhttps://github.com/gofiber/fiber17.7K

Go 言語フレームワーク一覧テーブル

Gin

Go 言語 を触ったことある人ならば、必ずと言っていいほど聞いたことがあるくらいの大人気フレームワークです。その人気の理由は優れたパフォーマンスと開発性にあります。

パフォーマンスが優れている理由として、 HttpRouter と呼ばれる機能を使用しており、ルーティングを高速に行います。これのおかげ、最大 40 倍高速のパフォーマンスを備えた API を作成できます。

生産性においては、 プレーン な Go 言語 でそのまま開発したときを考えてください。
ただの単純な GET メソッド API を作成するとき、初学者その記述量に落胆の声が上がるかと思います。私もその一人です。
ですが、 Gin を使用することで非常に明瞭にルーティング制御を行うことができます。どのくらい明瞭になるかは以下にサンプルコードを記述するので参考にしてみてください。

プレーン Go

func Index(w http.ResponseWriter, r *http.Request, _httprouter.Params) {
  fmt.Fprint(w, "Welcome!\n")
}

http.HandleFunc("/users/", Index)

Gin

func(c *gin.Context) {
  c.JSON(200, gin.H{ "message": "Welcome"})
})

router.GET("/", Index)

メリット

  1. ミドルウェア作成のサポート
    Gin はミドルウェアの作成をサポートします。
    ミドルウェアはそれぞれの機能の合間に必ず実行する処理を記載することができます。これにより開発効率とコード短縮を期待できます。

  2. デファクトスタンダード
    現状で最も人気で有名といってもいい フレームワーク です。
    ドキュメントもブログも非常に多く、初心者が学ぶには最適な フレームワーク となります。

  3. 高パフォーマンス
    Gin は、メモリ効率が非常に高く使用することで高いパフォーマンスを期待できます。

デメリット

  1. 追記予定

環境構築

// 実行可能ファイルをインストールします。
$ go get -u github.com/gin-gonic/gin

サンプルコード

package main

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

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

筆者評価

Go 言語 の デファクトスタンダード ですが、使ってみればなぜここまで人気が出たかすぐにわかります。導入のしやすさ、学習のしやすさ、小規模開発から中規模開発まで一通りできてしまう柔軟性さ、どれをとっても素晴らしいです。シンプルで読みやすいことから、初心者の個人開発やチーム開発において力を発揮します。

初心者にお勧めしたい フレームワーク No1 です。

Revel

Revel は MVC アーキテクチャ を採用されており、PHP の CakePHP や Java の Spring を使ったことがある人は学習しやすい フレームワーク です。

Revel のは機能として以下を提供します。どれも使いやすく、また最近の フレームワーク では必須といえる機能です。

  • ルーティング
  • パラメータ解析
  • テスト
  • セッション制御
  • テンプレート
  • キャッシング
  • ジョブ実行

サンプルコード

type MyAppController struct {
  revel.Controller
  MyMappedData map[string]interface{}
}

// Assume that this is called for all the controller functions
func (c MyAppController) Before() {
  c.MyMappedData = map[string]interface{}{}
}

// This function will be called when the Controller is put back into the stack
func (c MyAppController) Destroy() {
  c.Controller.Destroy()
  // Clean up locally defined maps or items
  c.MyMappedData = nil
}

メリット

  1. MVC アーキテクチャ のサポート Revel は、MVC の作成をサポートします。 MVC は Model,Vuew,Controller を分けることができ、チーム開発で担当を分けることが可能かつ、機能の再利用が容易になります。

  2. 高パフォーマンス Revel は、メモリ効率が非常に高く使用することで高いパフォーマンスを期待できます。

デメリット

  1. 追記予定

環境構築

git clone https://github.com/revel/examples.git
revel run examples/booking

筆者評価

追記予定

beego

Beego は、多くの機能を提供している大規模アプリケーション開発に最適な Go 言語フレームワーク です。

多機能であり、Restful API,Web アプリ,バックエンドサービスなどの開発をこれ一つで構築することができます。

Beego は基本 4 つの機能で構成されています。

  • 基本モジュール ログモジュール、構成モジュール、ガバナーモジュールを含みます。
  • タスク 時限タスクまたは定期的なタスクを実行するために使用されます。クーロン Job を簡単に構築できます。
  • クライアント ORM モジュール、httplib モジュール、キャッシュモジュールを含みます。
  • サーバー Web モジュールを含みます。将来的には gRPC をサポートします。

メリット

  1. MVC フレームワーク MVC アーキテクチャを使用しており、コード管理がしやすく開発者とデザイナーでそれぞれ役割分担を行えます。

デメリット

  1. 追記予定

環境構築

go get github.com/beego/beego/v2@latest

サンプルコード

package main

import "github.com/beego/beego/v2/server/web"

func main() {
  web.Run()
}

筆者評価

追記予定

Iris

Express.js ライクな、Go 言語フレームワークです。Node.js で開発を行ったことがある人ならば学習コストが低く最良なフレームワークです。

非常多機能で既にバンドルされている機能を利用することで、複数のパッケージを選択する時間を節約することでき、開発者の負担を減らしてくれます。

機能としては、以下が既に導入されており開発段階でそれらの機能をインポートし使用するだけです。また MVC フレームワークアーキテクチャを採用しています。

  • Sessions
  • API バージョニング
  • WebScoket
  • 依存性注入
  • WebAssembly

メリット

  1. Express.js ライクなフレームワーク
    Node.js のフレームワーク である、Express.js に似たコーディングが可能です。 Express.js を使用したことがある人ならば、すんなり覚えることが可能です。
  2. MVC アーキテクチャ
    MVC アーキテクチャを使用しており、コード管理がしやすく開発者とデザイナーでそれぞれ役割分担を行えます。
  3. 様々な機能がバンドルされている
    あらかじめ開発に必要な機能がバンドルされており、それらの機能をインポートするだけで利用できます。改めて Go 言語パッケージを選定する必要がないため非常に効率的な開発を行えます。

デメリット

  1. 追記予定

環境構築

go get github.com/kataras/iris/v12@master # or @v12.2.0-alpha2

サンプルコード

package main
import "github.com/kataras/iris/v12"

func main() {
app := iris.New()
  booksAPI := app.Party("/books") {
    booksAPI.Use(iris.Compression)
    // GET: http://localhost:8080/books
    booksAPI.Get("/", list)
    // POST: http://localhost:8080/books
    booksAPI.Post("/", create)
  }
  app.Listen(":8080")
}

  // Book example.
  type Book struct {
    Title string `json:"title"`
  }

  func list(ctx iris.Context) {
    books := []Book {
    {"Mastering Concurrency in Go"},
    {"Go Design Patterns"},
    {"Black Hat Go"},
  }

  ctx.JSON(books)
  // TIP: negotiate the response between server's prioritizes
  // and client's requirements, instead of ctx.JSON:
  // ctx.Negotiation().JSON().MsgPack().Protobuf()
  // ctx.Negotiate(books)
  }
  func create(ctx iris.Context) {
    var b Book
    err := ctx.ReadJSON(&b)
    // TIP: use ctx.ReadBody(&b) to bind
    // any type of incoming data instead.
    if err != nil {
      ctx.StopWithProblem(iris.StatusBadRequest, iris.NewProblem().
      Title("Book creation failure").DetailErr(err))
      // TIP: use ctx.StopWithError(code, err) when only
      // plain text responses are expected on errors.
      return
  }
  println("Received Book: " + b.Title)
  ctx.StatusCode(iris.StatusCreated)
}

Echo

Labstack によって作成されたフレームワークです。 Echo はマイクロフレームワークであり、軽量であり非常にシンプルです。必要最低限の機能しか提供されていないでプロダクトに必要なものだけを選定し入れることができます。

Echo は HTTP/2 もサポートしており、パフォーマンス面で優秀でユーザーに価値のあるコンテンツを高速で提供できます。

メリット

  1. マイクロフレームワーク
    必要最低限の機能しか提供していないので、他機能と競合することがなく必要な機能はプロダクトによってカスタム可能です。
  2. ミドルウェア作成のサポート
    Echo はミドルウェアの作成をサポートします。 ミドルウェアはそれぞれの機能の合間に必ず実行する処理を記載することができます。これにより開発効率とコード短縮を期待できます。

デメリット

  • 追記予定

環境構築

go get github.com/labstack/echo/v4

サンプルコード

package main

import (
  "github.com/labstack/echo/v4"
  "github.com/labstack/echo/v4/middleware"
  "net/http"
)

func main() {
  // Echo instance
  e := echo.New()

  // Middleware
  e.Use(middleware.Logger())
  e.Use(middleware.Recover())

  // Routes
  e.GET("/", hello)

  // Start server
  e.Logger.Fatal(e.Start(":1323"))
}

// Handler
func hello(c echo.Context) error {
  return c.String(http.StatusOK, "Hello, World!")
}

Fiber

Express.js ライクな Go 言語フレームワークです。メモリ使用量が少なく、ルーティングが豊富です。Express.js の影響を強く受けており、Express.js の使いやすさと生の Go 言語のパフォーマンスを合体させたようなフレームワークです。 そのため、現状最も高速で使いやすい Go 言語フレームワークであるといえます。

または静的コンテンツのキャッシュ機能や WebSocket 双方向 TCP 接続もサポートしているためリアルタイム Web アプリケーションを作る上で非常に強力な選定対象になります。

メリット

  1. Express.js ライクなフレームワーク
    node.js フレームワークである、Express.js ライクな書き方で開発できます。 Express.js を使用したことがある人ならば、すんなりキャッチアップできます。
  2. Web Socket と静的コンテンツキャッシュのフルサポート
    デフォルトで機能サポートされているため、モジュールを選定・インストールする必要がありません。

デメリット

  1. 追記予定

環境構築

go get -u github.com/gofiber/fiber/v2

サンプルコード

func main() {
  app := fiber.New()
  // GET /api/register
  app.Get("/api/*", func(c *fiber.Ctx) error {
    msg := fmt.Sprintf("✋ %s", c.Params("*"))
    return c.SendString(msg) // => ✋ register
  })
  // GET /flights/LAX-SFO
  app.Get("/flights/:from-:to", func(c *fiber.Ctx) error {
    msg := fmt.Sprintf("💸 From: %s, To: %s", c.Params("from"), c.Params("to"))
    return c.SendString(msg) // => 💸 From: LAX, To: SFO
  })
  // GET /dictionary.txt
  app.Get("/:file.:ext", func(c *fiber.Ctx) error {
    msg := fmt.Sprintf("📃 %s.%s", c.Params("file"), c.Params("ext"))
    return c.SendString(msg) // => 📃 dictionary.txt
  })
  // GET /john/75
  app.Get("/:name/:age/:gender?", func(c *fiber.Ctx) error {
    msg := fmt.Sprintf("👴 %s is %s years old", c.Params("name"), c.Params("age"))
    return c.SendString(msg) // => 👴 john is 75 years old
  })
  // GET /john
  app.Get("/:name", func(c *fiber.Ctx) error {
    msg := fmt.Sprintf("Hello, %s 👋!", c.Params("name"))
    return c.SendString(msg) // => Hello john 👋!
  })
  log.Fatal(app.Listen(":3000"))
}

まとめ

それぞれのフレームワークにメリットデメリットがあるので、開発で使用する場合にはよく精査して選ぶことおすすめします。

適当に決めてしまうと、後悔することになります。