フレームワークってよく聞くけど、一体何ができるんだろう?
Go言語のフレームワークには、どんなものがあるんだろう?
と疑問に思うことってありませんか?
そんなときは、実際にGo言語のフレームワークで使うコードを見てみると何ができるのか理解しやすくなります。今回はできるだけコードも載せながら、さまざまな種類のGo言語のフレームワークについて解説していきます。
なお、次の記事ではそもそもGoとはどんなプログラミング言語なのか、その特徴をできることや将来性も交え詳しく解説しているので良ければ参考にしてください。
→ Go言語とは?特徴やできること、学習方法をわかりやすく解説
Go言語とは
Go言語はGoogleが開発したプログラミング言語です。基本的な特徴としては、コンパイルと実行が高速で、シンプルな設計の言語とされています。静的型付け言語なのでJavaやCなどの開発言語と類似点が多い反面、継承が無いなどの特徴もあります。
- コンパイル
- ソースコードをコンピュータが理解できる言語に変換することをコンパイルといいます。
- 静的型付け言語
- 静的型付けとは、変数や定数の宣言時に入れる値のタイプを予め決めておく必要がある開発言語のことです。関数やメソッドの戻り値の型を宣言する必要がある場合も静的型付け言語に含まれます。
Webに関するGo言語のフレームワーク4選
Webフレームワークでできること
Webフレームワークというのは、クライアント(ブラウザやモバイルアプリケーションなど)からの通信を受け付けて中身を取得したり、クライアントに通信を返したりという処理を書きやすくする為のツールのようなものです。
Webフレームワークは、実は無くても開発ができます。もともとGoのスタンダードパッケージにnet/httpというパッケージが入っているので、これだけでも十分な機能があるからです。
と疑問に思うかもしれませんね。その疑問を解消するために、まずは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は拡張性が高くハイパフォーマンスな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構文がありません。その文エラーハンドリングがシンプルになっていますが、自分でエラーハンドリング用のコードを書かなければいけないという部分に変わりはありません。
gin
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") }
- ステータスコード
- サーバーがクライアントに返却するステータスです。通信エラーの場合は400系や500系のステータスコードを返却することが多く、正常に通信が返された場合は200系のステータスコードを返却することが多いです。
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はリレーション(テーブル同士の結合)やインデックス、ロールバック(処理の巻き戻し)など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:pass@tcp(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オブジェクトに変更するだけで接続ができます。
わざわざそんなことして二度手間では?と思うかもしれませんが、こうしておくことでデータベースを変更する必要性が出てきた時でも簡単にデータベースを切り替えられます。
pop
popもGo言語のORMフレームワークです。テーブルにIDカラムが無いといけない、という制約があります。
また、created_atやupdate_ateという名前のカラムがある場合は、レコード作成時の日時が自動で入力されます。少し面白いですね。
ただ、gormに比べてサンプルやドキュメントが少ないようなので、初めてGo言語を触る方はgormから入るといいでしょう。
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フレームワークやその他のフレームワークについてもご紹介しました。面白そうなフレームワークはあったでしょうか?
気になるフレームワークがあったら、是非一度使ってみてくださいね。