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

2023年において Go 言語のフレームワークを選定する際の参考になる情報を提供します。

概要

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

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

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

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

name Github Star
Gin https://github.com/gin-gonic/gin 54.8K
Revel https://github.com/revel/revel 12.6K
Beego https://github.com/beego/beego 27.6K
Iris https://github.com/kataras/iris 21.7K
Echo https://github.com/labstack/echo 21.5K
Fafiber https://github.com/gofiber/fiber 17.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. 学習曲線の急峻さ
    GinはGo言語のフレームワークとしては比較的シンプルですが、初心者にとっては学習コストがかかる場合があります。特に、Go言語自体に不慣れな場合は、文法や構造の理解に時間がかかるかもしれません。

  2. 豊富な機能の欠如
    Ginは軽量でシンプルなフレームワークとして知られており、他のフレームワークに比べて豊富な機能が提供されていません。一部の高度な機能やモジュールが欠けている場合があります。そのため、特定の機能を必要とする場合は、別のライブラリやモジュールを使用する必要があるかもしれません。

  3. ドキュメントの不足
    Ginは人気のあるフレームワークですが、他のフレームワークと比べて公式ドキュメントの量や詳細度が少ない場合があります。そのため、問題が発生した場合や特定の機能を理解したい場合には、他の開発者のブログやソースコードの参考に頼る必要があるかもしれません。

  4. コミュニティのサポートの差異
    Ginは人気のあるフレームワークではありますが、他のフレームワークに比べてコミュニティの規模や活発さが若干劣る場合があります。そのため、問題やバグに遭遇した場合には、解決までに時間がかかる可能性があります。

環境構築

// 実行可能ファイルをインストールします。
$ 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. フレームワークのサイズ
    Revelは比較的大きなフレームワークであり、他の軽量なフレームワークに比べてファイルサイズが大きくなる場合があります。これはプロジェクトのサイズやデプロイメントの時間に影響を与える可能性があります。

  2. 柔軟性の制限
    RevelはMVCアーキテクチャに厳密に従っており、特定の開発スタイルやパターンに合わせてカスタマイズする際に制約があるかもしれません。そのため、他のフレームワークよりも自由度が低い場合があります。

  3. 学習コスト
    Revelは他の一部のフレームワークに比べて学習コストが高い場合があります。特に、MVCアーキテクチャやRevel固有の概念に慣れていない場合は、学習に時間がかかるかもしれません。

  4. ドキュメントとリソースの限定性
    Revelは他の人気のあるフレームワークに比べてドキュメントやリソースが限定されている場合があります。そのため、特定の問題に対する解決策や開発上のヒントを見つけるのに苦労するかもしれません。また、コミュニティの規模が他のフレームワークに比べて小さく、サポートやフィードバックのレスポンスが遅い場合があります。

  5. 開発者の人気度の低さ
    Revelは他の一部のフレームワークに比べて開発者の人気度が低い場合があります。これは、開発者の求人市場やサポートの提供など、開発者が直面するさまざまな側面に影響を与えるかもしれません。

環境構築

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

筆者評価

RevelはMVCアーキテクチャを採用した使いやすいフレームワークであり、高パフォーマンスを提供します。ただし、いくつかのデメリットも考慮する必要があります。

メリットとしては、MVCアーキテクチャのサポートがあり、チーム開発や機能の再利用が容易になります。また、高いパフォーマンスを期待できます。

デメリットとしては、フレームワークのサイズが比較的大きく、柔軟性に制約があることが挙げられます。学習コストも他の一部のフレームワークに比べて高くなる可能性があり、ドキュメントやリソースの限定性、開発者の人気度の低さも認識しておく必要があります。

総合的には、RevelはMVCアーキテクチャに慣れた開発者や、高パフォーマンスが求められるプロジェクトに適しています。ただし、フレームワークのサイズや学習コストなどのデメリットを考慮し、プロジェクトの要件や開発者のニーズに合致するかどうかを慎重に判断する必要があります。

beego

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

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

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

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

メリット

申し訳ありません、先程の回答に追記する形でbeegoを使用する上での追加のメリットを以下にまとめます。

メリット

  1. 高い拡張性
    beegoは豊富な拡張機能を提供しており、モジュールやプラグインを使用することでアプリケーションの機能を簡単に追加することができます。さまざまなドメインや業界のニーズに合わせて拡張することができます。

  2. モジュールの豊富さ
    beegoは多くのモジュールを提供しており、ログ管理、構成管理、タスクスケジューリング、ORM、HTTPクライアント、キャッシュなどの機能を簡単に利用することができます。これにより、アプリケーション開発の効率性が向上します。

  3. ドキュメントの充実度
    beegoには公式ドキュメントが充実しており、APIリファレンスやチュートリアルなどが提供されています。初心者でも理解しやすい資料が揃っているため、学習や開発のサポートに役立ちます。

  4. アクティブなコミュニティ beegoは活発なオープンソースコミュニティが存在しています。開発者間の情報交換やサポートの提供、バグ修正や新機能の開発が行われており、コミュニティの力によってフレームワークの成長や改善が促進されます。

デメリット

  1. ドキュメントとリソースの限定性
    beegoは他の一部の人気のあるフレームワークに比べて、ドキュメントやリソースが限られている場合があります。特定の問題や開発上のヒントを見つけるのに苦労するかもしれません。また、コミュニティの規模が小さく、サポートやフィードバックのレスポンスが遅い場合があります。

  2. 学習コスト
    beegoは初めての開発者にとって学習コストが高い場合があります。MVCアーキテクチャやbeego固有の概念に慣れるまでに時間がかかる可能性があります。

  3. 柔軟性の制限
    beegoは一部の他のフレームワークに比べて柔軟性が制限されています。特定の開発スタイルやパターンに合わせてカスタマイズする際に制約があるかもしれません。そのため、他のフレームワークよりも自由度が低い場合があります。

  4. コミュニティの活発さ beegoのコミュニティは他の一部のフレームワークに比べて活発ではない場合があります。開発者の人気度やサポートの提供など、開発者が直面するさまざまな側面に影響を与えるかもしれません。

環境構築

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

サンプルコード

package main

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

func main() {
  web.Run()
}

筆者評価

beegoは多機能であり、大規模なアプリケーション開発に適したGo言語フレームワークです。豊富なモジュールや拡張機能、MVCアーキテクチャのサポートなど、開発の効率性と柔軟性を向上させる機能を提供しています。

また、ドキュメントの充実度や活発なコミュニティも魅力的です。公式ドキュメントやチュートリアルが充実しており、初心者でも学習しやすい環境が整っています。さらに、コミュニティによる情報交換やサポートの提供も行われており、開発者のニーズに対応するための改善や新機能の開発が行われています。

ただし、ドキュメントやリソースの限定性、学習コストの高さ、柔軟性の制限、コミュニティの活発さにいくつかの課題が存在します。ドキュメントやリソースが限られているため、特定の問題に対する解決策を見つけるのに苦労する場合があります。また、初めての開発者にとって学習コストが高い可能性があります。さらに、柔軟性やカスタマイズ性に制約があることも考慮すべきです。また、コミュニティの活発さや開発者の人気度にも改善の余地があるかもしれません。

総合的に見て、beegoは多機能であり、大規模なアプリケーション開発に適していると評価できます。ただし、一部の課題があるため、特定の要件や開発環境に合うかどうかを検討する必要があります。

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. ドキュメントとリソースの限定性
    Irisは他の一部の人気のあるフレームワークに比べて、ドキュメントやリソースが限られている場合があります。特定の問題に対する解決策を見つけるのに苦労するかもしれません。また、コミュニティの規模が小さく、サポートやフィードバックのレスポンスが遅い場合があります。

  2. 学習コスト
    Irisは他のフレームワークと比較して学習コストが高い場合があります。特に、Express.jsの経験がない開発者にとっては新しいコーディングスタイルや概念に慣れるまでに時間がかかるかもしれません。

  3. 柔軟性の制限
    Irisは他のフレームワークと比較して柔軟性が制限されています。あらかじめバンドルされている機能を使用することは便利ですが、特定の開発スタイルやニーズに合わせてカスタマイズする際に制約があるかもしれません。

環境構築

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)
}

筆者評価 IrisはExpress.jsに似たコーディングスタイルで開発ができるGo言語フレームワークであり、多機能な点やMVCアーキテクチャのサポートなどが魅力です。また、バンドルされている機能の多さにより、開発者の負担を減らして効率的な開発を行うことができます。

ただし、ドキュメントやリソースの限定性、学習コストの高さ、柔軟性の制限が存在します。ドキュメントやリソースの充実度が他のフレームワークに比べて低いため、問題解決や開発サポートに制約が生じる可能性があります。また、新しいコーディングスタイルや概念に慣れるまでの学習コストが高いことや、カスタマイズ性に制限があることも考慮すべきです。

総合的に見て、IrisはExpress.jsのような開発スタイルを好む開発者にとって魅力的な選択肢ですが、一部の制約や課題が存在します。開発者の要件や好みに合うかどうかを検討した上で、利用する価値があるか判断することが重要です。

Echo

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

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

メリット

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

デメリット

  1. ドキュメントとリソースの限定性
    Echoは他の一部の人気のあるフレームワークに比べて、ドキュメントやリソースが限られている場合があります。特定の問題に対する解決策を見つけるのに苦労するかもしれません。また、コミュニティの規模が小さく、サポートやフィードバックのレスポンスが遅い場合があります。

  2. 機能の制限
    Echoはマイクロフレームワークであり、必要最低限の機能しか提供していません。そのため、大規模なアプリケーションを開発する際には、追加の機能やツールを自分で実装する必要があるかもしれません。

  3. 学習コスト
    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!")
}

筆者評価 Echoはシンプルで軽量なマイクロフレームワークであり、必要な機能のみを選択して組み込むことができます。マイクロサービスや小規模なアプリケーションの開発に適しています。また、ミドルウェアの作成をサポートするなど、開発効率を高める機能も備えています。

ただし、ドキュメントやリソースの限定性、機能の制限、学習コストの高さが課題となります。ドキュメントやリソースの充実度が他のフレームワークに比べて低いため、問題解決や開発サポートに制約が生じる可能性があります。また、大規模なアプリケーション開発には追加の機能やツールの実装が必要になる場合があります。

総合的に見て、Echoはシンプルなマイクロフレームワークとして使いやすく、軽量なアプリケーションの開発に適しています。ただし、大規模なプロジェクトや拡張性が必要な場合には、他のフレームワークの検討も必要です。

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. ドキュメントとリソースの限定性
    Fiberは比較的新しいフレームワークであり、他の一部の人気のあるフレームワークに比べてドキュメントやリソースが限られている場合があります。特定の問題に対する解決策を見つけるのに苦労するかもしれません。また、コミュニティの規模が小さく、サポートやフィードバックのレスポンスが遅い場合があります。

  2. 成熟度の低さ
    Fiberは比較的新しいフレームワークであり、まだ成熟している段階ではありません。そのため、安定性や信頼性の面で他の成熟したフレームワークと比較すると劣る可能性があります。

環境構築

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"))
}

筆者評価

Fiberは高速で使いやすいGo言語フレームワークであり、Express.jsの影響を受けたシンプルなAPI設計が特徴です。静的コンテンツのキャッシュ機能やWebSocketのサポートなど、リアルタイムWebアプリケーション開発に便利な機能も備えています。

ただし、まだ新しいフレームワークであるためドキュメントやリソースの充実度が他のフレームワークに比べて低く、成熟度も低いというデメリットがあります。しかし、Fiberは急速に成長しており、将来的にはさらなる改善が期待されます。

総合的に見て、Fiberは高速なパフォーマンスと使いやすさを重視する場合におすすめのフレームワークです。ただし、プロジェクトの要件や成熟度の重要度に応じて検討する必要があります。

まとめ

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