Sorry, This post is Japanese Only.
There is a sample file for WEB-CGI of Go Language.
This file named main.exe is transfered to IIS server and actioned from HTML form tag on WEB page.
さて、サンプルソース。まずは、こんなHTMLページを作成。
<html>
<head>
<meta http-equiv = "content-type" content = "text/html; charset=utf-8" >
</head>
<body>
<form method="get" action="main.cgi">
<input type="text" name="name" value="ダンボハナアルキ">
<input type="submit" value="送信">
</form>
</body>
</html>
文字コードがUTF-8である所がポイントね。
そして、Goプログラムを一つ作成。
package main
import (
"fmt"
"os"
"http"
)
type H struct {
背番号 int
カナ byte
名前 string
住んでる所 string
性格 string
}
func GetHanaaruki(name string) (H,bool) {
oHanaaruki := H{1,'o', "オオハナアルキ", "地上", "ちょっと凶暴"}
mHanaaruki := H{2,'m', "マンモスハナアルキ", "地上", "のんびり"}
dHanaaruki := H{3,'d', "ダンボハナアルキ", "空中", "ぱたぱた系"}
jHanaaruki := H{4,'j', "ジェットハナアルキ", "空中", "ビュンビュン系"}
bHanaaruki := H{5,'b', "バニラ・ランモドキ", "樹上", "お色気派"}
//map型の生成
hmap := map[string]H {
"オオハナアルキ":oHanaaruki,
"マンモスハナアルキ":mHanaaruki,
"ダンボハナアルキ":dHanaaruki,
"ジェットハナアルキ":jHanaaruki,
"バニラ・ランモドキ":bHanaaruki }
// map型はkey値を使って直接Value値を取得できる。
// 取得できたらrに本体、eにTrue、無ければeにFalseをReturn
r,e := hmap[name]
return r,e
}
func header(){
headerlines := []string{
"Content-type: text/html\n\n",
"",
"",
"",
"",
""}
//配列をrangeでforする
// 配列のインデックスだけで処理したいので、2番目は_をセット
for i,_ := range headerlines{
fmt.Printf("%s\n",headerlines[i])
}
}
func footer(){
footerlines := []string{
"
produced by Tugu Katagiri. Hanaaruki lover.
",
""}
//配列をrangeでforする
// 配列の内容だけで処理したいので、1番目は_をセット
for _,v := range footerlines{
fmt.Printf("%s\n",v)
}
}
func main(){
header()
fmt.Printf("%sから、%sでようこそ!
\n",os.Getenv("REMOTE_HOST"),os.Getenv("HTTP_USER_AGENT"));
fmt.Printf("パラメータは %s
", os.Getenv("QUERY_STRING"))
fmt.Printf("
")
fmt.Printf("デコードしてみた:
\n")
// httpパッケージを使ってパラメータを取得
// retMap = map[string][]string 型 key=ID名 value=フォーム値
// e = os.Error 型 nilなら取得成功 エラーならe.Stringにメッセージがある
retMap,e := http.ParseQuery(os.Getenv("QUERY_STRING"))
if e == nil {
//配列をrangeでforする
// map型なので、keyとvalueで取得できる
for key,val := range retMap{
fmt.Printf("%s=%s
\n",key,val)
}
fmt.Printf("探してみた:
\n")
r,e := retMap["Name"]
if e {
gh,e := GetHanaaruki(r[0])
if e{
fmt.Printf("%s
\n",gh)
}else{
fmt.Printf("いないよ
\n")
}
}else{
fmt.Printf("フォームにNameがないよ
\n")
}
}else{
fmt.Printf("%s
\n",e.String())
}
footer()
}
今度は長い。構造体は今までのサンプルで使っているものと同等なので説明は割愛。
ソース内に、ポイントとなる部分はコメントにしておきましたですよ。
そして実行環境。WEBサーバーはもちろん、WindowsプラットホームのIIS、今回はWindows2003 Server R2上のIISで実験。
基本的な導入方法はWindowsPortのバイナリ環境設定と同じでOK。
過去のこのエントリのがサーバー上で動けば準備は完了
こんにちは、Go言語!
http://blogs.wankuma.com/esten/archive/2010/06/03/189690.aspx
そして、コンパイルしたmain.exe と HTMLファイルをFTPしてHTMLファイルを表示して
送信ボタンをクリックすると
結果表示。
C言語で書くCGIとなんら変わらない動き。
でも、このプログラミングだと、Go言語らしい部分はサッパリ封印された状態。
実は、まだまだ、こんなもんじゃないんだぜ?(にやり)