こんにちは。KOUKIです。
とある企業で、Go言語を使ったWebアプリケーションの開発に携わっています。
Goでは、Webアプリケーションを簡単に作れる仕組みを提供していますが、基本の骨組みはテンプレート化できるかと思い、この記事を作りました。
ローカルでWebサーバーを立ち上げ、ブラウザから「http://localhost:8080」へアクセスすると簡単なページを表示できます。
<目次>
Staticファイルの配信方法
本記事にプラスして、Staticファイル配信の方法を以下の記事にまとめました。
簡易Webアプリのテンプレート
ワークスペース
1 2 3 4 5 6 7 8 9 10 11 |
mkdir webapp cd webapp # webappは自由に変更すること go mod init webapp mkdir -p cmd/web mkdir -p internal/handlers mkdir html touch cmd/web/main.go touch cmd/web/routes.go touch html/home.jet touch internal/handlers/handlers.go |
1 2 3 4 5 6 7 8 9 10 11 12 |
$ tree . webapp ├── cmd │ └── web │ ├── main.go │ └── routes.go ├── go.mod ├── html │ └── home.jet └── internal └── handlers └── handlers.go |
go modでGo Modules(パッケージ管理)を導入しているところがミソです。これで、プログラム実行時に必要なパッケージを自動でインストールできます。
html
htmlフォルダは、Webページのテンプレートファイル入れます。
home.jet
home.jetは、Webページのテンプレートファイルです。拡張子の「.jet」はCloudyKit/jet(テンプレートエンジン)で扱うためのものです。
※テンプレートエンジンはいろいろありますが、ここでは上記のものを使っています
1 2 3 4 5 6 7 8 9 10 11 12 |
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Home</title> </head> <body> <h1>Home Page</h1> </body> </html> |
internal
internalフォルダは、内部のみで使用するソースコードを格納するための場所です。
handler
handlerフォルダには、ハンドラ処理を実装したファイルを入れます。
handlers.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
package handlers import ( "log" "net/http" "github.com/CloudyKit/jet/v6" ) var views = jet.NewSet( jet.NewOSFileSystemLoader("./html"), jet.InDevelopmentMode(), ) func Home(w http.ResponseWriter, r *http.Request) { err := renderPage(w, "home.jet", nil) if err != nil { log.Println(err) } } func renderPage(w http.ResponseWriter, tmpl string, data jet.VarMap) error { view, err := views.GetTemplate(tmpl) if err != nil { log.Println(err) return err } err = view.Execute(w, data, nil) if err != nil { log.Println(err) return err } return nil } |
cmd
cmdには、プログラムを実行するソースコードを格納します。
web
今回はWebサーバーの作成であるため、webフォルダを作成し、その中にmainパッケージを格納します。
routes.go
ここには、エントリポイントを実装します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package main import ( "webapp/internal/handlers" "net/http" "github.com/bmizerany/pat" ) func routes() http.Handler { mux := pat.New() mux.Get("/", http.HandlerFunc(handlers.Home)) return mux } |
main.go
ここで、Webサーバー(アプリ)を起動します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package main import ( "log" "net/http" ) func main() { mux := routes() log.Println("Starting web server on port 8080") _ = http.ListenAndServe(":8080", mux) } |
Webアプリ起動
1 2 3 4 |
$ go run cmd/web/*.go go: finding module for package github.com/CloudyKit/jet/v6 go: found github.com/CloudyKit/jet/v6 in github.com/CloudyKit/jet/v6 v6.1.0 2021/03/25 07:32:51 Starting web server on port 8080 |
「http://localhost:8080」にアクセスしてください。

OKですね。
おわりに
今回、Webアプリのテンプレートとしてファイル構成とコードサンプルを紹介しましたが、もちろんこれが絶対的な正解というわけではありません。
プロジェクトの状況によって、カスタマイズしてくださいね^^
それでは、また!
コメントを残す
コメントを投稿するにはログインしてください。