はじめに
前回の記事の続きです。
前回の記事はこちら
Goで簡単なWebサーバを立てる
ついに、GoでWebサーバを立てる章まで来ました。
早速サンプルをローカル環境で実行してみましょう。
どうやらWebサーバが立ち上がったようです。localhost:9090
を見てみます。
おぉ!どうやらうまくいきました。
続けて、localhost:9090/?url_long=111&url_long=222
にURLを変更してみます。
こちらもうまく行っているようですね。main.exe
で起動したコンソールに、何やらいっぱい出力されています。
プログラムの確認
ここまでで、Webサーバが立てられて、リクエストパラメータも受け取れて出力できているようです。
中身で何をやっているのか自分なりに解析してみます。
まずは 一番初めに実行される main
を見てみましょう。
おそらく下記の部分が肝ですね。
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作業を行うか
です。