Go言語で開発しているとき、PHPやRubyなどの言語とは異なり、ビルドをしないとソースは反映されません。
ソースを更新して、ビルドしてを繰り返すのはだんだん面倒になってきますよね。
そこでこの記事では、Airを利用してホットリロードを実現する方法を紹介します。
ホットリロード対応することで、ファイルを保存しただけで自動でビルドが実行されるようになり、大変便利です。

ホットリロードとは?
ホットリロードとは、変更された差分を検知して最新のプログラムに自動で反映することです。
通常Go言語では、コードを変更した際にビルドが必要になります。
今回紹介するAirは、
- ファイルの変更を検知
- 最新のソースでビルドを実施
- プログラムを実行して最新を反映
のステップを自動で行ってくれます。
なのでいちいちプログラムを止めてビルドを手動でする必要はありません。

1度慣れるとホットリロードなしては開発できないくらい便利です…( ꒪﹃ ꒪)
ホットリロードを検証するための環境構築
まずはサンプル用のプロジェクトを作成します。
$ mkdir go-hotreload-sample && cd go-hotreload-sample
$ go mod init go-hotreload-sample
フレームワークとしてはサンプルとしてechoを使用します。
まずはechoをダウンロードします。
$ go get github.com/labstack/echo/v4
次に main.go を用意します。以下のコードは 「localhost:8080」 にアクセスしたら 「Hello, World!」 とレスポンスを返す簡易Webサーバーです。
package main
import (
"net/http"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
)
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(":8080"))
}
// Handler
func hello(c echo.Context) error {
return c.String(http.StatusOK, "Hello, World!")
}
go runコマンドでプログラムを起動してみます。
$ go run main.go
ターミナルの別ウィンドウから以下のリクエストを送ると、レスポンスが帰ってくることを確認します。
$ curl http://localhost:8080
Hello, World!
Airでホットリロードを実現する
さて、お試しの環境ができたのでいよいよAirでホットリロードを実現します。
Airのダウンロード
以下のコマンドでAirをダウンロードします。
$ go get -u github.com/cosmtrek/air
Airが問題なく起動できるか以下のコマンドで確認します。
$ air -v
__ _ ___
/ /\ | | | |_)
/_/--\ |_| |_| \_ , built with Go
Airでプログラムを動かす
Airが確認できたら、go runを使わずに以下のコマンドでプログラムを起動します。
$ air
以下のようにechoが立ち上がることを確認します。
$ air
__ _ ___
/ /\ | | | |_)
/_/--\ |_| |_| \_ , built with Go
mkdir /path-to-dir/go-hotreload-sample/tmp
watching .
watching bin
!exclude tmp
building...
running...
____ __
/ __/___/ / ___
/ _// __/ _ \/ _ \
/___/\__/_//_/\___/ v4.5.0
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
O\
⇨ http server started on [::]:8080
起動できたことを確認したら、main.goのレスポンス返却部分を変更してみます。
// Handler
func hello(c echo.Context) error {
return c.String(http.StatusOK, "hogehoge")
}
curlで再度確認します。
$ curl http://localhost:8080
hogehoge
レスポンスが 「hogehoge」に変化していますね。これでホットリロードできていることを確認できました。

今回の記事はここまでです。
Go言語の入門にはスターティングGo言語やUdemyがおすすめです!
コメント