Help us understand the problem. What is going on with this article?

Goでnet/httpしてみる

More than 1 year has passed since last update.

目的

Goでhello worldの学習が完了したので、次にWebアプリ作ってみたいなーと思っていたところ、
net/httpなるパッケージを発見し早速動かしてみました。今回使用するコードはGithub上にございます。

net/httpとは?

Goのパッケージです。ドキュメントはこちら
その名の通り、HTTPクライアントとサーバーの機能を実装するためのパッケージです。

hello world!

まずはまずはhello worldですよね。こちらの記事を参考にさせていただきました。

server1.go
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!!
スクリーンショット 2018-12-01 20.10.02.png

解説

一体どうなっているのか、ドキュメントを参考にコードをみていきます。

http.HandleFunc("/", handler)

あたえられたURLパターン(第1引数)に対して、ハンドラ(第2引数)をDefaultServeMuxに登録します。(DefaultServeMuxは後ほど出てきます)
ハンドラとは、何らかのアクションをトリガーに実行される関数です。
つまり、第1引数で定義したパターンでリクエストが来たら、第2引数で定義したハンドラを呼び出すよ。ということです。

第1引数 "/"

トリガーとなるURLパターンを登録します。試しに/helloに変更してみます。
/だと見つかりませんね。
スクリーンショット 2018-12-01 20.35.29.png
/helloだと見つかりました。
スクリーンショット 2018-12-01 20.35.37.png

第2引数 handler

実行されるハンドラです。試しに2パターンセットしてみます。

server2.go
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と表示されます。
スクリーンショット 2018-12-01 20.48.55.png

/hander2の場合は(l抜けちゃいました)、hander2というハンドラが呼び出されるので、handler2と表示されます。
スクリーンショット 2018-12-01 20.49.02.png

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上にございます。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away