はじめに

前回の記事の続きです。
前回の記事はこちら

Goで簡単なWebサーバを立てる

ついに、GoでWebサーバを立てる章まで来ました。
早速サンプルをローカル環境で実行してみましょう。

vscode-golang-01
main.exe ができているのでこれを実行してみます。

vscode-golang-02
アクセスを許可するを押して実行します。

どうやらWebサーバが立ち上がったようです。
localhost:9090 を見てみます。
firefox-01

おぉ!どうやらうまくいきました。

続けて、localhost:9090/?url_long=111&url_long=222 にURLを変更してみます。
web-server-01

こちらもうまく行っているようですね。
main.exe で起動したコンソールに、何やらいっぱい出力されています。

プログラムの確認

ここまでで、Webサーバが立てられて、リクエストパラメータも受け取れて出力できているようです。
中身で何をやっているのか自分なりに解析してみます。

まずは 一番初めに実行される main を見てみましょう。 おそらく下記の部分が肝ですね。

1
2
http.HandleFunc("/", sayhelloName) //アクセスのルーティングを設定します。
err := http.ListenAndServe(":9090", nil) //監視するポートを設定します。
  • / でURLを受けたときに(/ はホストドメインの直下)、 sayhelloName が実行される仕組みと思います。
    HandleFunc はそういう関数と想定します。
  • ListenAndServe については、どのポートでWebサーバを立てて受けられるかを決めているようです。
    第2引数がnil なのでどういうものかはわかりません、第1引数は:9090 なので、これでポート9090番で受けられるようになっていると思います。

一度ここで上記の考察があっているか、ドキュメントを見に行きましょう。
HandleFunc: https://godoc.org/net/http#HandleFunc

func HandleFunc(pattern string, handler func(ResponseWriter, *Request))

見る限り想定はあっていそうですね。

pattern : 指定されたパターン(パス)
handler : パスに対応する関数
patten があっていた際に、対応する関数が発火するようにセットするイベントハンドラですね。

ListenAndServe: https://godoc.org/net/http#ListenAndServe

func ListenAndServe(addr string, handler Handler) error

見る限りこちらも想定通りそうです。
addr: 指定したアドレス(ポート番号)
handler: ハンドラ
addr に対してTCPネットワークの接続待ち状態にするみたいです。

ListenAndServe listens on the TCP network address addr and then calls Serve with handler to handle requests on incoming connections. Accepted connections are configured to enable TCP keep-alives.

handler はデフォルトでnil でその場合は DefaultServeMux が使われるそうです。 ん~、このあたりは深く追わないほうが良さそうかな。
ちょっと調べてみた限り、いくつか登録できる箱があってデフォルトはDefaultServeMux みたい?
登録する箱を指定できるっぽい。
コネクションプール的なもの?(曖昧なので調査は必要そうです)

サーバについて

もしあなたが以前PHPプログラマであれば。こう問うかもしれません。
我々のnginx、apacheサーバは必要ないのですかと?
なぜならこいつは直接tcpポートを監視しますので、nginxがやることをやってくれます。
またsayhelloNameは実は我々が書いたロジック関数ですので、phpの中のコントローラ(controller)関数に近いものです。
もしあなたがPythonプログラマであったのなら、tornadoを聞いたことがあると思います。
このコードはそれとよく似ていませんか?ええ、その通りです。
GoはPythonのような動的な言語によく似た特性を持っています。
Webアプリケーションを書くにはとても便利です。 もしあなたがRubyプログラマであったのなら、RORの/script/serverを起動したのと少し似ている事に気づいたかもしれません。

確かに、PHP プログラマなので nginx , apache サーバは必要ではと思いましたが、
PHPでいうところのビルトインサーバに近いのかなと思いました。(多分)
(※あちらはテストサーバ用なので、用途としては異なると思います。)

Goを通じて簡単な数行のコードでwebサーバを立ち上げることができました。
さらにこのWebサーバの内部ではマルチスレッドの特性をサポートしています。
続く2つの節でGoが如何にWebのマルチスレッドを実現しているのか細かくご紹介します。

次回からは Goの強みでもある並列・並行プログラミングが見られるような感じですね!

最後に

Docker の環境を作る予定でしたが、nginx などのWebサーバを使うわけではないのでやめました、すみません。
次回は、GoはどのようにしてWeb作業を行うか です。