net/httpを利用してGoでローカルサーバーを立ち上げよう!

Go言語
この記事は約8分で読めます。
Go初学者
Go初学者

WEBアプリ開発の一歩としてローカルサーバーを立ち上げたいんだけど…

この記事ではGoでローカルサーバーを立ち上げる基本を理解できます!
  • Goの標準パッケージ・net/http を利用してローカルサーバーを立ち上げる
  • URLを指定してHTMLファイルを表示する

今回はGoの標準パッケージ・net/http を利用して、あなたのパソコンにサーバー(ローカルサーバー)を立ち上げてみましょう!

Goの基本文法だけのプログラミング学習では、プログラミングの楽しさを知ることができません。

実際にローカルサーバーを立ち上げることで、WEBアプリ開発の楽しさを知る一歩を踏み出せますよ。

もりぴ
この記事を書いた人

XHTML1.0時代にHTML&CSSを勉強した経験あり。無趣味だった私が2020年5月からプログラミング学習を開始し現在も挫折せずに趣味で学習を楽しんでいる51歳。プログラミングの楽しさをブログを通してお伝えしていきます。

もりぴをフォローする

net/httpを利用してローカルサーバーを立ち上げる第一歩!

Go言語ではサーバー関連の標準パッケージ・net/http を利用することで簡単にローカルサーバーを立ち上げることができます。

パソコン君
パソコン君

立ち上げるだけだど1行のコードで大丈夫だよ!

package main

import (
    "net/http"
)

func main() {
    http.ListenAndServe(":8080", nil)
}

http.ListenAndServe(":8080", nil) とmain関数内に記述しプログラムを実行するとローカルサーバーを立ち上げることができます。

// 出力結果
$ go run main.go
  ← カーソルが点滅もしくわ表示されたまま

実行すると出力結果には何も表示されずに、カーソルが点滅もしくわ表示されたままです。

この状態でブラウザを立ち上げて、localhost:8080 と入力してアクセスしてみましょう。

もりぴ
もりぴ

この状態でサーバーが立ち上がっています!

サーバーを終了するには、ターミナルで ctrl + c を押すことで終了します。

ブラウザに文字を表示してみよう!

これだけだと面白くないので文字を表示してみましょう。

package main

import (
    "net/http"
)

type TestHandler struct{}

func (h *TestHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "ブラウザに文字を表示するテストです!")
}

func main() {
    http.ListenAndServe(":8080", &TestHandler{})
}

それでは、先程と同様にターミナルでプログラムを実行してみます。

このプログラムでの理解するポイントは…

サーバー関連では (w http.ResponseWriter, r *http.Request) が頻出するパターンである

ということを押さえておきましょう。

ただ、このままの状態だと、例えば localhost:8080/top/ とアクセスしてもブラウザに表示される内容は一緒です。

URLを指定して内容を変えてみましょう。

URLを指定して表示する内容を変えてみる

それではURLを指定して表示する内容を変えてみましょう。

HTMLファイルを用意する

前準備として、今回は2つのHTMLファイルを用意します。

// index.html

<!DOCTYPE html>
<html lang="ja">

<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>Go Lesson! Index</title>
</head>

<body>
  {{ . }}
</body>

</html>
// hello.html

<!DOCTYPE html>
<html lang="ja">

<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>Go Lesson! Greetings</title>
</head>

<body>
  {{ . }}
</body>

</html>

index.htmlhello.html を用意しました。

パソコン君
パソコン君

内容は title タグの違いだけだよ!

Goのプログラムを作成する

プログラムの内容は下記の通りです。

// main.go

package main

import (
    "html/template"
    "log"
    "net/http"
)

func index(w http.ResponseWriter, r *http.Request) {
    t, err := template.ParseFiles("index.html")
    if err != nil {
	log.Println(err)
    }
    t.Execute(w, "トップページです!")
}

func hello(w http.ResponseWriter, r *http.Request) {
    t, err := template.ParseFiles("hello.html")
    if err != nil {
	log.Println(err)
    }
    t.Execute(w, "こんにちは!!")
}

func main() {
    http.HandleFunc("/", index)
    http.HandleFunc("/hello", hello)

    http.ListenAndServe(":8080", nil)
}

説明の前にプログラムを実行してみましょう。

まずは、localhost:8080 にブラウザでアクセスしてみます。

続いて localhost:8080/hello にアクセスしてみましょう。

Go初学者
Go初学者

おっ!URLを変えると表示も変わりましたね!

プログラムの流れを確認

今回のプログラムの流れを簡単にご説明いたします。

プログラムの流れ
  • http.HandleFunc("/", index) で第1引数にアクセスするURL、第2引数に実行する関数を指定する
  • 関数の作成
    1. func index(w http.ResponseWriter, r *http.Request)http.Handlefunc() の第2引数と同名の関数を作成する
    2. t, err := template.ParseFiles("index.html") で読み込むHTMLファイルを解析しテンプレートを作成する
    3. t.Execute(w, "トップページです!") 作成したテンプレートを実行する

HTMLファイル内の…

<body>
  {{ . }}
</body>

{{ . }} は、GoがHTMLファイルを解析しテンプレートを作成した時に、t.Execute(w, "トップページです!")トップページです! に置き換わります。

今回、HTMLファイルを2つ用意したのは、プログラムがパターン化されていることを確認してほしかったからです。

【演習】公式サイトのWriting Web Applicationsに挑戦しよう!

ローカルサーバーの演習問題に最適なのが、公式サイトに用意されている Writing Web Applications が最適です。

サイトは英語ですがGoogle翻訳を利用すれば大丈夫です。

上から順番にコードを記述していき動きを確認しながローカルサーバーの理解を深めることができます。

英語ですが臆せずに挑戦してみましょう。

もりぴ
もりぴ

Writing Web Applicationsの内容が理解できれば、この記事の内容はだいたい網羅されています。

【最後に】net/httpを利用してGoでローカルサーバーを立ち上げよう!

今回はGoの標準パッケージ・net/http を活用してローカルサーバーを立ち上げて、URLごとに表示内容を変えるプログラムを作成しました。

プログラムがパターン化されているので、コードを書く上で自分で管理しやすいようにメモなどに残しておいても良いと思います。

もりぴ
もりぴ

今回、プログラムの内容には突っ込まないでおきました。

まずはサーバーを立ち上げて、自分で書いたGoのプログラムを実行することでブラウザに文字が表示される動きを確認してほしいと単純に思いました。

私もパソコン内でサーバーが立ち上がり、自分の書いた関数で表示が切り替わることにプログラミングの楽しさを感じたからです。

少しでも楽しさを共感してもらえれば、嬉しく思います。

comment

タイトルとURLをコピーしました