#目的
Goでhello worldの学習が完了したので、次にWebアプリ作ってみたいなーと思っていたところ、
net/httpなるパッケージを発見し早速動かしてみました。今回使用するコードはGithub上にございます。
#net/httpとは?
Goのパッケージです。ドキュメントはこちら。
その名の通り、HTTPクライアントとサーバーの機能を実装するためのパッケージです。
#hello world!
まずはまずはhello worldですよね。こちらの記事を参考にさせていただきました。
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, World")
}
func main() {
http.HandleFunc("/", handler) // ハンドラを登録してウェブページを表示させる
http.ListenAndServe(":8080", nil)
}
server1.goを実行します。
go run server1.go
localhost:8080にアクセスして、、、やりました、hello world!!
#解説
一体どうなっているのか、ドキュメントを参考にコードをみていきます。
http.HandleFunc("/", handler)
あたえられたURLパターン(第1引数)に対して、ハンドラ(第2引数)をDefaultServeMuxに登録します。(DefaultServeMuxは後ほど出てきます)
ハンドラとは、何らかのアクションをトリガーに実行される関数です。
つまり、第1引数で定義したパターンでリクエストが来たら、第2引数で定義したハンドラを呼び出すよ。ということです。
###第1引数 "/"
トリガーとなるURLパターンを登録します。試しに/helloに変更してみます。
/だと見つかりませんね。
/helloだと見つかりました。
###第2引数 handler
実行されるハンドラです。試しに2パターンセットしてみます。
package main
import (
"fmt"
"net/http"
)
func handler1(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "I am handler1")
}
func handler2(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "I am handler2")
}
func main() {
http.HandleFunc("/hander1", handler1)
http.HandleFunc("/hander2", handler2)
http.ListenAndServe(":8080", nil)
}
/hander1の場合は(l抜けちゃいました)、handler1というハンドラが呼び出されるので、handler1と表示されます。
/hander2の場合は(l抜けちゃいました)、hander2というハンドラが呼び出されるので、handler2と表示されます。
##http.ListenAndServe(":8080", nil)
Listenするアドレスと、ハンドラーを定義しています。
###第1引数 ":8080"
TCPのネットワークアドレスを設定します。今回のようにhost部分の記載が省略されると、使用可能なインターフェースを利用するため、localhostが使用されています。:以降はポートですね。
今回の場合、localhostの8080でListenすることになります。
###第2引数 nil
ハンドラーを設定します。
nilを設定すると、DefaultServeMuxが使用されます。(HandleFuncで設定したやつです)
##func handler(w http.ResponseWriter, r *http.Request)
ハンドラーを定義します。
###第1引数 w ResponseWriter
HTTPレスポンスを構成する際に使用されます。
###第2引数 r *http.Request
サーバーが受け取ったHTTP Requestのことです。*はポインタです。
##fmt.Fprintf(w, "I am handler1")
ResponseWriterであるwに"I am handler1"を書き込んでいます。
#まとめ
net/httpのhello worldでした。コードはGithub上にございます。