はじめに
最近、Go言語のシンプルさと高いパフォーマンスに興味を持ったため、
試しにHTTPサーバーを構築してみました。
1.Goのインストール
Go言語は、公式サイトから各OSに合わせたインストーラーを使用して簡単にインストールできます。
私はMacを使用しているので、Macのインストーラーを使用しました。
このコマンドでバージョン情報が表示されれば準備完了です。
% go version
go version go1.23.1 darwin/amd64
2. Goプロジェクトの作成
Goプロジェクトの依存関係管理には、Go Modulesを使用するのが一般的です。
ここでは、Goプロジェクトのディレクトリを作成し、初期化する手順を説明します。
まず、新しいGoプロジェクト用のディレクトリを作成します。
% mkdir go-http-server
% cd go-http-server
次に下のコマンドを実行してプロジェクトをGoモジュール化します。
% go mod init example.com/go-http-server
これにより、プロジェクトのルートディレクトリにgo.modファイルが生成され、プロジェクトの依存関係が管理できるようになります。
フォルダー構成については以下のようにします。
go-http-server/
├── cmd/
│ └── app/
│ └── main.go
├── internal/
│ └── handlers/
│ └── handler.go
└── go.mod
- cmd/: アプリケーションのエントリーポイントとなるコードを配置します。main.goはこのフォルダーに置き、サーバーの起動処理を記述します。
- internal/: プロジェクトの内部で使用するコードを配置します。この例では、HTTPリクエストを処理するハンドラー関数をinternal/handlers/に配置します。
- go.mod: Go Modulesを使用してプロジェクトの依存関係を管理するための設定ファイルです。
3. 各ファイルの実装内容
cmd/app/main.go
このファイルには、サーバーを起動するためのコードを記述します。Goプログラムでは、main.goがアプリケーションのエントリーポイントとなり、HTTPサーバーの実行がここから開始されます。
package main
import (
"log"
"net/http"
"example.com/go-http-server/internal/handlers"
)
func main() {
http.HandleFunc("/", handlers.HelloHandler) // ハンドラーの設定
log.Println("Starting server on :8080...")
log.Fatal(http.ListenAndServe(":8080", nil)) // サーバーをポート8080で起動
}
internal/handlers/handler.go
このファイルには、リクエストに対してレスポンスを返すハンドラー関数を定義します。
今回は、シンプルな Hello, World! を返すハンドラーを定義します。
package handlers
import (
"fmt"
"net/http"
)
func HelloHandler(w http.ResponseWriter, r *http.Request) {
name := r.URL.Query().Get("name")
if name == "" {
name = "World"
}
fmt.Fprintf(w, "Hello, %s!", name) // リクエストに応じて動的なレスポンスを返す
}
4. プロジェクトの実行
プロジェクトのコードを書き終えたら、次にサーバーを実行します。
go run cmd/app/main.go
サーバーが正常に起動すると、ブラウザで http://localhost:8080 にアクセスできます。
クエリパラメータnameが指定されていない場合は Hello, World! と表示され、
http://localhost:8080/?name=Go のようにクエリパラメータを指定すると"Hello, Go!"というメッセージが表示されます。
終わりに
Goを使用して、HTTPサーバーをゼロから構築してみました。
Goの標準ライブラリだけで簡単にサーバーを立ち上げることができました。
次のステップとして、ミドルウェアの追加やデータベースの連携など、さらに高度な機能を実装していこうと思います。