【目的別】Go言語のフレームワークおすすめ9選


フレームワークってよく聞くけど、一体何ができるんだろう?
Go言語のフレームワークには、どんなものがあるんだろう?

と疑問に思うことってありませんか?

そんなときは、実際にGo言語のフレームワークで使うコードを見てみると何ができるのか理解しやすくなります。今回はできるだけコードも載せながら、さまざまな種類のGo言語のフレームワークについて解説していきます。

Go言語とは

Go言語はGoogleが開発したプログラミング言語です。基本的な特徴としては、コンパイルと実行が高速で、シンプルな設計の言語とされています。静的型付け言語なのでJavaやCなどの開発言語と類似点が多い反面、継承が無いなどの特徴もあります。

さらに詳しい解説については下記の記事にも記載しておりますので、ぜひご一読ください。

今更聞けない!プログラミング言語「Go」とは何か?
更新日 : 2019年7月18日

コンパイル
ソースコードをコンピュータが理解できる言語に変換することをコンパイルといいます。

静的型付け言語
静的型付けとは、変数や定数の宣言時に入れる値のタイプを予め決めておく必要がある開発言語のことです。関数やメソッドの戻り値の型を宣言する必要がある場合も静的型付け言語に含まれます。

Webに関するGo言語のフレームワーク4選

フレームワーク

フレームワークのイメージ

Webフレームワークでできること

Webフレームワークというのは、クライアント(ブラウザやモバイルアプリケーションなど)からの通信を受け付けて中身を取得したり、クライアントに通信を返したりという処理を書きやすくする為のツールのようなものです。

Webフレームワークは、実は無くても開発ができます。もともとGoのスタンダードパッケージにnet/httpというパッケージが入っているので、これだけでも十分な機能があるからです。

じゃあなんでわざわざ色々な種類のWebフレームワークが出ていて、それについて学ばないといけないの?

と疑問に思うかもしれませんね。その疑問を解消するために、まずはnet/httpパッケージのみで書いたサーバプログラムを見てみましょう。

package main
import (
    "fmt"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        if r.Method == http.MethodGet {
            fmt.Println("hello world! It is Get Request.")
        }

        if r.Method == http.MethodPost {
            fmt.Println("hello world! It is Post Request.")
        }
    })

    http.ListenAndServe(":8080", nil)
}

これだけでリクエスト(通信)を受け付けることはできますが、GetリクエストとPostリクエスト(※)の書き分けが少し面倒です。今の段階ではまだ「そんなに面倒じゃないんじゃない?」と感じるかもしれません。

ただ、実際のソースコードはもっと行数が多いことが大半です。つまり、エンドポイント(通信の受け口)が増えれば増えるほど、If文の分岐が増えることになります。

If文だらけのソースコードは、考えるだけでも頭痛がしそうですね。ではWebフレームワークを使うことでどれだけ便利に書けるのか?ということをこれからご紹介します。

GetリクエストとPostリクエスト
リクエストというのはクライアント(※)から送る通信のことです。このリクエストには色々な種類のものがありますが、代表的なものがGetリクエストとPostリクエストになります。

クライアント
通信の送り元の事です。たとえばWebブラウザやモバイルアプリ等、サーバーに対して通信を送るものがクライアントと呼ばれます。

echo

echo

echoは拡張性が高くハイパフォーマンスなWebフレームワークとされています。Webフレームワークの中ではかなり認知度が高いと思います。

では、echoフレームワークを使うと、ソースコードをどれだけシンプルにかけるのでしょうか?

package main

import (
    "net/http"

    "github.com/labstack/echo"
)

func main() {
    e := echo.New()

    e.GET("/", func(c echo.Context) error {
        return c.String(http.StatusOK, "Hello, World! This is Get request")
    })

    e.POST("/", func(c echo.Context) error {
        return c.String(http.StatusOK, "Hello, World! This is Post request")
    })

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

GetリクエストとPostリクエストの判別をIf文で行う必要が無くなりましたね。しかも、e.Logger.Fatal()というメソッドがあると思いますが、この部分でエラーハンドリング(※)も行っています。

さっきのnet/httpパッケージではエラーハンドリングをきちんと書いていませんでした。つまり、実際にエラーハンドリングも行おうとするとさらに行数が増える上に、全て自分で書かなければいけないということです。

Webフレームワークを使うことで、そういった悩みから解放されます。

エラーハンドリング
例外処理の事です。Go言語にはtry-catch構文がありません。その文エラーハンドリングがシンプルになっていますが、自分でエラーハンドリング用のコードを書かなければいけないという部分に変わりはありません。

公式:https://echo.labstack.com/

gin

gin

引用元:Gin https://gin-gonic.com/

ginは高速・かつミドルウェアが豊富なWebフレームワークです。そして、例外が発生した時にもアプリケーションがクラッシュしないようにサポートします。(クラッシュというのは、アプリケーションが何らかのエラーで動かなくなってしまうことを指します)

ginで書いたソースコードは下記のようになります。echoと同じようにリクエストメソッド(PostなのかGetなのか)の判別をif文で行う必要もなく、クライアント側に通信を返す際にもc.String()にステータスコード(※)と返したい文字列を与えるだけです。

すごくシンプルで、分かりやすいですよね。

package main

import (
    "net/http"
    "github.com/gin-gonic/gin"
)

func main() {
    g := gin.Default()

    g.GET("/", func(c *gin.Context) {
        c.String(http.StatusOK, "Hello World! This is Get request.")
    })

    g.POST("/", func(c *gin.Context) {
        c.String(http.StatusOK, "Hello World! This is Post request.")
    })

    g.Run(":8080")
}

公式:https://gin-gonic.com/

ステータスコード
サーバーがクライアントに返却するステータスです。通信エラーの場合は400系や500系のステータスコードを返却することが多く、正常に通信が返された場合は200系のステータスコードを返却することが多いです。

aero

aero

aeroは非常に高速なwebフレームワークです。GitHubに公表されているベンチマーク(比較)を見れば、その素晴らしさが分かると思います。

ベンチマーク(比較)

ソースコードの書き方は、他のwebフレームワークとあまり変わりありません。それなのにこれだけ速度に差が出ていると考えるとすごいですね。

package main

import "github.com/aerogo/aero"

func main() {
    a := aero.New()

    a.Get("/", func(ctx aero.Context) error {
        return ctx.String("Hello World! This is Get request.")
    })

    a.Post("/", func(ctx aero.Context) error {
        return ctx.String("Hello World! This is Get request.")
    })

    a.Run()
}

aeroはシンプルながら高速で素晴らしいフレームワークなのですが、他のWebフレームワークに比べてドキュメントやサンプル情報が少ないように見受けられます。Go言語にかなり慣れている方なら問題ありませんが、aeroを採用する際には少し慎重になった方がいいかもしれません。

データベース・SQLに関するフレームワーク4選

データベースのイメージ

データベースのイメージ

ORMフレームワークでできること

ORM(object-relational mapping)フレームワークを使うと、複雑なSQLを少しシンプルに書くことができます。さらに細かく言うと、概念的なオブジェクトを物理オブジェクトにする時に発生する不整合を解決できるのですが、複雑な内容なのため今回は割愛します。

SQL
データベースを操作するための言語です

データベース
データの集合体です。ユーザー情報(氏名・住所・電話番号)や記事情報など色々なデータが該当します

gorm

gorm

引用元:Gorm https://gorm.io/

gormはリレーション(テーブル同士の結合)やインデックス、ロールバック(処理の巻き戻し)などSQLの機能を広くサポートしています。

import (
  "gorm.io/driver/mysql"
  "gorm.io/gorm"
)

func main() {
  // refer https://github.com/go-sql-driver/mysql#dsn-data-source-name for details
  dsn := "user:[email protected](127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
  db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
}

gorm.Open()というメソッドでデータベースとの接続を行っています。このメソッドにMySQLのオブジェクトを渡していますが、PostgreSQLであればその引数をPostgreSQLオブジェクトに変更するだけで接続ができます。

わざわざそんなことして二度手間では?と思うかもしれませんが、こうしておくことでデータベースを変更する必要性が出てきた時でも簡単にデータベースを切り替えられます。

公式:https://gorm.io/

pop

pop

引用元:pop https://gobuffalo.io/en

popもGo言語のORMフレームワークです。テーブルにIDカラムが無いといけない、という制約があります。

また、created_atやupdate_ateという名前のカラムがある場合は、レコード作成時の日時が自動で入力されます。少し面白いですね。

ただ、gormに比べてサンプルやドキュメントが少ないようなので、初めてGo言語を触る方はgormから入るといいでしょう。

公式:https://gobuffalo.io/en

sqlx

sqlx

sqlxというORMライブラリは、データベースから取得してきたレコードを構造体・マップ・スライスに変換できます。また、構造体の名前付きパラメータに対応しています(名前つきパラメータというのは、構造体のフィールドにラベルのようなものを付与したものです)。

シンプルでドキュメントやサンプルも多いので、gormと並んで比較的使いやすいフレームワークと言えます。

公式:http://jmoiron.github.io/sqlx/

その他のおすすめフレームワーク2選

ツール

ツールのイメージ

slacker

URL:shomali11/slacker(https://github.com/shomali11/slacker

こちらはSlackBotを作る為のフレームワークです。Botというのは、自動で発言したりするロボットです。

このslackerというライブラリを使うと、Go言語でSlackBotの開発ができます!

aurora

URL:logrusorgru/aurora(https://github.com/logrusorgru/aurora

auroraフレームワークは、標準出力に色をつけることができます。標準出力とは、コンソール(黒い画面)のことです。

色をつけて出力すると、こんな感じになります。

package main

import (
    "fmt"

    . "github.com/logrusorgru/aurora/v3"
)

func main() {
    fmt.Println(Magenta("Helloooooo"),Yellow("World!"))
    fmt.Println(Bold(Cyan("Helloooooo")), Bold(Green("Wold!")))
}

デバックコンソ―ル

CLIアプリケーションを作るときに使うと、ちょっと楽しいですよね。

まとめ

今回はWebフレームワークを中心に、ORMフレームワークやその他のフレームワークについてもご紹介しました。面白そうなフレームワークはあったでしょうか?

気になるフレームワークがあったら、是非一度使ってみてくださいね。

「プログラミング、右も左もわからない…」という方にオススメ

当プログラミングスクール「侍エンジニア塾」では、これまで6000人以上のエンジニアを輩出してきました。

その経験を通してプログラミング学習に成功する人は、「目的目標が明確でそれに合わせた学習プランがあること」「常に相談できる人がそばにいること」「自己解決能力が身につくこと」この3つが根付いている傾向を発見しました。

侍エンジニア塾は上記3つの成功ポイントを満たすようなサービス設計に磨きをかけております。

cta_under_bnr

「自分のスタイルや目的に合わせて学習を進めたいな」とお考えの方は、ぜひチェックしてみてください。

書いた人

侍エンジニア塾ブログ編集部

侍エンジニア塾は「人生を変えるプログラミング学習」をコンセンプトに、過去多くのフリーランスエンジニアを輩出したプログラミングスクールです。プログラミングに役立つ情報や有用な情報を発信していきます。
サービスページはこちら

おすすめコンテンツ

まずはここから!初心者でも1から学べるプログラミング入門カリキュラム

転職成功で受講料0円!あなたもプログラミングを学んでエンジニアデビュー