Skip to content

Instantly share code, notes, and snippets.

@hidenorigoto
Created November 13, 2009 17:39
Show Gist options
  • Save hidenorigoto/234013 to your computer and use it in GitHub Desktop.
Save hidenorigoto/234013 to your computer and use it in GitHub Desktop.
golang CGI form sample
package main
import(
"io";
"fmt";
"bytes";
"template";
"os";
"strings";
"strconv";
"http";
)
/*
* テンプレートのパラメータ受け渡し用のinterface
*/
type S struct {
name string;
title string;
}
/*
* メイン処理
*/
func main(){
// テンプレートを読み込む。
var tmpl *template.Template;
tmpl = loadTemplate("sample.tpl");
if tmpl == nil {
outputData("テンプレートの読み込みに失敗しました。");
return;
}
// HTTPパラメータを取得する。
params, param_len := getPostData();
// データを準備する。
s := new(S);
s.title = "Go Template サンプル2";
s.name = "Go";
if param_len > 0 {
if params["yourname"] != "" {
s.name = params["yourname"];
}
}
// テンプレートにデータを埋め込む。
output := applyTemplate(tmpl, s);
// 表示する。
outputData(output);
}
/*
* テンプレートを読み込む
*/
func loadTemplate(path string) (tmpl *template.Template) {
var filedata []byte;
var err os.Error;
// 指定したパスのファイルを読み込む。
filedata, err = io.ReadFile(path);
if err != nil {
return nil;
}
// テンプレートとしてパースする。
tmpl, err = template.Parse(bytes.NewBuffer(filedata).String(), nil);
if err != nil {
return nil;
}
return tmpl;
}
/*
* テンプレートにデータを適用する
*/
func applyTemplate(tmpl *template.Template, params interface{}) (ret string) {
var buf bytes.Buffer;
// 適用する。
err := tmpl.Execute(params, &buf);
if err != nil {
return "";
}
return buf.String();
}
/*
* HTTPレスポンスを返す
*/
func outputData(body string) {
fmt.Print("Content-type: text/html; charset=UTF-8\n\n");
fmt.Print(body);
}
/*
* HTTP POSTデータを解析する
*/
func getPostData() (params map[string] string, param_num int) {
// データが送信されていなければ何もしない。
content_length, _ := strconv.Atoi(os.Getenv("CONTENT_LENGTH"));
if content_length == 0 {
return nil, 0;
}
// 標準入力から読み込む。
var buf [1024]byte;
_, err := os.Stdin.Read(&buf);
if err != nil {
return nil, 0;
}
// 読み込んだデータを文字列に変換する。
// バッファサイズより短い場合は切りつめる。
buffer := bytes.NewBuffer(&buf);
if content_length < 1024 {
buffer.Truncate(content_length);
}
var data = buffer.String();
// パラメータ用のmapを初期化する。
params = make(map[string]string);
// 読み込んだデータをマップに変換する。
var pairs = strings.Split(data, "&", 0);
for _, v1 := range pairs {
var pair = strings.Split(v1, "=", 0);
if len(pair) > 0 {
for i, v2 := range pair {
// URLエンコードを解除
pair[i], _ = http.URLUnescape(v2);
}
params[pair[0]] = pair[1];
}
}
return params, len(params);
}
<html>
<head><title>{title|html}</title></head>
<body>
<h1>CGIでGOサンプル2</h1>
<br />
Goでテンプレートを使ってフォームを表示し、POSTされたデータを受け取るサンプルです。
<br />
<br />
<h1>こんにちは、{name|html}さん!</h1>
<br />
<form action="" method="post">
<input type="text" name="yourname" size="20" maxlength="20" value="{name|html}" />
<input type="submit" name="送信" value="送信" />
</form>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment