前のパートに戻る 完了して次のパートへ  

  1-2 Web サーバーを起動しよう

今回のパートでは Web サーバーを起動してウェブブラウザから HTTP リクエストを受け取れるようにプログラムを改良していきます。

本パートの目標物


ウェブブラウザからリクエストを受け取って画面上に Hello World という文字列を表示させてみます。

目標物を作成するまでの流れ


  1. Web サーバーの実装
  2. 外部パッケージの管理

では実際に進めていきましょう。

1. Web サーバーの実装


Web サーバーを作成するにあたり、本教材では echo という軽量な Web フレームワークを採用します。

main.go ファイルを開き、中身を次のソースコードで完全に上書きして保存しましょう。

go-tech-blog
└── main.go

ソースコードの解説はパートの最後にまとめて実施します。まずは教材通りにソースコードを配置してプログラムを動かすところまで進んでみましょう。

2. パッケージの依存関係の管理

外部パッケージである echo を利用するので、プログラムを起動する際には echo のソースコードも必要になります。こうした外部パッケージを管理する手段として、Go では go mod コマンドが準備されています。

パッケージを管理していくにあたり、まずはターミナルを起動して次のコマンドを実行します。

$ go mod tidy

go mod tidy はソースコードを検査して、どのような外部パッケージを利用しているかを判定します。ソースコード内で利用されている外部パッケージは go.mod と go.sum というファイルに書き出されます。直接的に利用しているパッケージは go.mod に、間接的に利用しているパッケージは go.sum に記載されます。

go mod tidy コマンドで依存パッケージの書き出しが完了したら、次は下記のコマンドを用いて外部パッケージのソースコードを PC にダウンロード(キャッシュ)します。

$ go mod download

ダウンロードされた外部パッケージのソースコードは $HOME/go/pkg/mod/ に配置されます。tree コマンドを利用して確認してみましょう。

$ tree $HOME/go/pkg/mod -L 3 -d

実行結果は次のようになります。

/Users/ユーザ名/go/pkg/mod
├── cache
│   ├── download
│   │   ├── github.com
│   │   ├── golang.org
│   │   ├── google.golang.org
│   │   └── gopkg.in
│   └── vcs
│       ├── xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
│       ├── (途中略)
│       └── xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
├── github.com
│   ├── davecgh
│   │   └── [email protected]
│   ├── dgrijalva
│   │   └── [email protected]+incompatible
│   ├── labstack
│   │   ├── echo
│   │   └── [email protected]
│   ├── mattn
│   │   ├── [email protected]
│   │   └── [email protected]
│   ├── pmezard
│   │   └── [email protected]
│   ├── stretchr
│   │   ├── [email protected]
│   │   └── [email protected]
│   └── valyala
│       ├── [email protected]
│       └── [email protected]
├── golang.org
│   └── x
│       ├── [email protected]
│       ├── [email protected]
│       ├── [email protected]
│       └── [email protected]
└── gopkg.in
    ├── [email protected]
    └── [email protected]

75 directories

今回 Web サーバー作成するために利用する echo や、その echo 自身が利用しているパッケージ群のソースコードがダウンロードされています。

(補足)外部パッケージがダウンロードされていない状態では、VSCode はソースコードを見つけられずエラーを出力します。一方でパッケージのダウンロードが完了してもエラー表示が消えない場合もあります。その場合は VSCode を再起動するとエラーが表示されなくなります。

動作確認


それではソースコードが準備できたので、実際に Web サーバーを起動してウェブブラウザからアクセスしてみます。

Web サーバーを起動するには次のコマンドをターミナルで実行します。

$ go run main.go

次のようなログが表示されたら、Web サーバーの起動は成功です。

$ go run main.go

   ____    __
  / __/___/ /  ___
 / _// __/ _ \/ _ \
/___/\__/_//_/\___/ v4.1.10
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
                                    O\
⇨ http server started on [::]:8080

サーバーの起動に成功したら、ウェブブラウザからアクセスしてみます。Chrome を立ち上げ、アドレスバーに http://localhost:8080 と入力してリクエストを実行します。

Hello World が表示されました。

動作確認が済んだら Web サーバーを停止しておきます。ターミナル上で control + C を押すと Web サーバーは停止します。

ソースコードの解説


main.go ファイルについて解説をしていきます。

go-tech-blog
└── main.go

このソースコードが main パッケージに属することを宣言しています。

このファイル上のソースコードがどのようなパッケージを利用しているかを宣言しています。上2つのパッケージは Go 言語自体が提供する標準パッケージと呼ばれるもので、下2つのパッケージは外部パッケージです。

Go プログラム(パッケージ)を実行した際は、依存パッケージの読み込み > グローバル定数 > グローバル変数 > init() > main() の順に実行(判定)されていきます。よって、main() と init() よりも先に上記のグローバル変数の部分が処理されて、createMux() 関数が呼び出されます。上記のソースコードは main パッケージ のグローバル変数である e に createMux() 関数の戻り値を格納している箇所です。

この部分ではアプリケーションのインスタンスを生成し、各種設定を追加した上で関数の呼び出し元に返却しています。

この部分ではグローバル変数に格納されたアプリケーションインスタンスに対してルーティングの設定を行い、Web サーバーの起動を行なっています。

この部分ではハンドラ関数を定義しています。HTTP リクエストが Web サーバーに届いた際の具体的な処理の入り口となります。

HTTP リクエストの情報(リクエストの送信元や各種パラメータ等)は、 echo.Context という構造体でハンドラ関数に渡ってきます。リクエスト情報を構造体へ詰め替える作業や、ハンドラ関数に対してデータを引数で受け渡す部分は、フレームワークである echo が担当してくれています。


以上で今回のパートは終了です。

このパートでは Web サーバーを起動してウェブブラウザからアクセスし、レスポンスを画面に表示してみました。今回作成したプログラムは、起動後リクエストが届くのを待ち、リクエストが届いたらリクエスト元へと文字列を返却しています。Web アプリケーションとしては大きな前進です。

次のパートでは単なる文字列を返却するのではなく、文章を構造的に表示するための HTML を返却するようにプログラムを改良していきます。ウェブサイトを構築する上では欠かせないパートです。引き続きがんばっていきましょう。

お疲れさまでした。

議論

0 質問

このコースの評価は?