読者です 読者をやめる 読者になる 読者になる

Go で http アプリケーションサーバ

デフォルトで付いてくるパッケージで、httpd (アプリケーション) が簡単に作れます。

import . "http" とすると、http. の前置なしで http パッケージの関数が使えるので、見た目も結構すっきり。

HandlerFunc(func(c *Conn, req *Request) {

が繰り返されるのはちょっとうるさい感じですが。
# あとはテンプレートエンジンがあれば…… 付属してました → Go でテンプレートエンジン (json template) - 酒日記 はてな支店
http://gist.github.com/236088

package main
import (
    . "http";  // http パッケージの関数を http. prefix なしで使えるように
    "io";
    "fmt";
)

func main() {
    gourl := "http://golang.org/";

    Handle("/", HandlerFunc(func(c *Conn, req *Request) {
        io.WriteString(c, "hello, world!\n");
    }));
    Handle("/go", HandlerFunc(func(c *Conn, req *Request) {
        // リダイレクト
        Redirect(c, gourl, 302);
    }));
    Handle("/header", HandlerFunc(func(c *Conn, req *Request) {
        // レスポンスヘッダを設定
        c.SetHeader("X-Powered-By", "Go <" + gourl + ">");
        io.WriteString(c, "ok");
    }));
    Handle("/static/", HandlerFunc(func(c *Conn, req *Request) {
        // ファイルを配信
        ServeFile(c, req, "." + req.URL.Path);
    }));
    Handle("/params", HandlerFunc(func(c *Conn, req *Request) {
        body := "";
        for key, val := range req.Header {
            // リクエストヘッダを列挙
            body = body + fmt.Sprintf("%s: %s<br>", key, val);
        }
        req.ParseForm(); // クエリパラメータを Parse
        for key, val := range req.Form {
            // クエリパラメータを列挙
            for i := range val {
                body = body + fmt.Sprintf("%s=%s<br>", key, val[i]);
            }
        }
        io.WriteString(c, body);
    }));

    err := ListenAndServe(":8080", nil);
    if err != nil {
        panic("ListenAndServe: ", err.String())
    }
}