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

前の節でWebはhttpプロトコルに基づいたサービスであるとご紹介しました。Go言語では完全なnet/httpパッケージを提供しています。httpパッケージを通して実行できるWebサービスを非常に簡単に立ち上げる事ができます。同時にこのパッケージを使用することで、簡単にWebのルーティング、静的なファイル、テンプレート、cookie等のデータに対して設定と操作を行うことができます。

## httpパッケージでWebサーバを立てる

	package main

	import (
		"fmt"
		"net/http"
		"strings"
		"log"
	)

	func sayhelloName(w http.ResponseWriter, r *http.Request) {
		r.ParseForm()  //オプションを解析します。デフォルトでは解析しません。
		fmt.Println(r.Form)  //このデータはサーバのプリント情報に出力されます。
		fmt.Println("path", r.URL.Path)
		fmt.Println("scheme", r.URL.Scheme)
		fmt.Println(r.Form["url_long"])
		for k, v := range r.Form {
			fmt.Println("key:", k)
			fmt.Println("val:", strings.Join(v, ""))
		}
                fmt.Fprintf(w, "Hello astaxie!") //ここでwに入るものがクライアントに出力されます。
	}

	func main() {
		http.HandleFunc("/", sayhelloName) //アクセスのルーティングを設定します。
		err := http.ListenAndServe(":9090", nil) //監視するポートを設定します。
		if err != nil {
			log.Fatal("ListenAndServe: ", err)
		}
	}

上のコードはbuildした後、web.exeを実行した際、9090ポートでhttpリンクリクエストを監視します。

ブラウザで`http://localhost:9090`を入力してください。

ブラウザで`Hello astaxie!`と出力されたのが見えたかと思います。

アドレスを変えて試してみましょう：`http://localhost:9090/?url_long=111&url_long=222`

ブラウザで出力されたものは何でしょうか。サーバは何と出力していますか？

サーバで出力される情報は以下の通りです：

![](images/3.2.goweb.png?raw=true)

図3.8 ユーザがWebにアクセスしてサーバが出力する情報

上のコードでWebサーバを書くためにはhttpパッケージの２つの関数を呼ぶだけで良いことがわかります。

>もしあなたが以前PHPプログラマであれば。こう問うかもしれません。我々のnginx、apacheサーバは必要ないのですかと？なぜならこいつは直接tcpポートを関ししますので、nginxがｓやることをやってくれます。またsayhelloNameは実は我々が書いたロジック関数ですので、phpの中のコントローラ（controller）関数に近いものです。

>もしあなたがPythonプログラマであったのなら、tornadoを聞いたことがあると思います。このコードはそれとよく似ていませんか？ええ、その通りです。GoはPythonのような動的な言語によく似た特性を持っています。Webアプリケーションを書くにはとても便利です。

>もしあなたがRubyプログラマであったのなら、RORの/script/serverを起動したのと少し似ている事に気づいたかもしれません。

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

## links
   * [目次](<preface.md>)
   * 前へ: [Webの作業方法](<03.1.md>)
   * 次へ: [Goはどのようにしてweb作業を行うか](<03.3.md>)
