サンプルコード(WEBプログラミング編)


WEBCGIプログラム

単純なWEBCGI

HTMLフォームから呼び出されて、結果を表示

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",
   "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">",
   "<HTML><HEAD>",
   "<meta HTTP-EQUIV = \"Content-Type\" CONTENT = \"text/html; charset=UTF-8\" >",
   "<title>ハナアルキさん?</title>",
   "</HEAD><BODY>"}

 //配列をrangeでforする 
 // 配列のインデックスだけで処理したいので、2番目は_をセット
 for i,_ := range headerlines{
   fmt.Printf("%s\n",headerlines[i])
 }

}

func footer(){

 footerlines := []string{
   "<br /><hr>produced by Tugu Katagiri. Hanaaruki lover.<br />",
   "</body>"}

 //配列をrangeでforする 
 // 配列の内容だけで処理したいので、1番目は_をセット
 for _,v := range footerlines{
   fmt.Printf("%s\n",v)
 }

}

func main(){

 header()

 fmt.Printf("%sから、%sでようこそ!<br />\n",os.Getenv("REMOTE_HOST"),os.Getenv("HTTP_USER_AGENT"));
 fmt.Printf("パラメータは %s<br />", os.Getenv("QUERY_STRING"))
 fmt.Printf("<hr>")
 fmt.Printf("デコードしてみた:<br/>\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<br/>\n",key,val)
   }

   fmt.Printf("探してみた:<br/>\n")

   r,e := retMap["Name"]

   if e {

      gh,e := GetHanaaruki(r[0])

      if e{
         fmt.Printf("%s<br/>\n",gh)
      }else{
         fmt.Printf("いないよ<br/>\n")
      }

    }else{
      fmt.Printf("フォームにNameがないよ<br/>\n")
    }

   }else{

   fmt.Printf("%s<br/>\n",e.String())

 }

 footer()
}
				

これはHTMLから呼び出されるCGI。FormのName要素にある文字をあらかじめ作っておいたMAP型配列で検索して、一致するものがあれば内容を返します

構造体の宣言処理や配列処理、MAP型処理の基本的なサンプルでもあります

テンプレートによるWEBページ作成
package main 

import ( 
 "os"
 "template" 
 "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', "バニラ・ランモドキ", "樹上", "お色気派"}

 hmap := map[string]H {
   "オオハナアルキ":oHanaaruki,
   "マンモスハナアルキ":mHanaaruki,
   "ダンボハナアルキ":dHanaaruki,
   "ジェットハナアルキ":jHanaaruki,
   "バニラ・ランモドキ":bHanaaruki }

 r,e := hmap[name]

 return r,e

}

const tplOK = ` 
   <!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">
   <HTML><HEAD>
   <meta HTTP-EQUIV = \"Content-Type\" CONTENT = \"text/html; charset=UTF-8\" >
   <title>{名前}みっけ!</title>
   </HEAD>
   <BODY>
   <center>
   {名前}さんは{住んでる所}に住んでて、{性格}なハナアルキさんだよ
   </center>
   <br /><hr>produced by Tugu Katagiri. Hanaaruki lover.<br />
   </body>
   </html>
` 
const tplNG = ` 
   <!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">
   <HTML><HEAD>
   <meta HTTP-EQUIV = \"Content-Type\" CONTENT = \"text/html; charset=UTF-8\" >
   <title>{@}なんてないさ!</title>
   </HEAD><BODY>
   <b>{@}なんて嘘さ!</b>
   <br /><hr>produced by Tugu Katagiri. Hanaaruki lover.<br />
   </body>
   </html>
` 
const tplFailure = ` 
   <!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">
   <HTML><HEAD>
   <meta HTTP-EQUIV = \"Content-Type\" CONTENT = \"text/html; charset=UTF-8\" >
   <title>失敗!</title>
   </HEAD><BODY>
   <b>{@}なんてフィールド、ないよ!</b>
   <br /><hr>produced by Tugu Katagiri. Hanaaruki lover.<br />
   </body>
   </html>
` 

func main() { 

 retMap,_ := http.ParseQuery(os.Getenv("QUERY_STRING"))

 r,e := retMap["Name"]

 if e {

   gh,e := GetHanaaruki(r[0])

   if e{
      t := template.MustParse(tplOK, nil); 
      t.Execute(gh, os.Stdout); 
   }else{
      t := template.MustParse(tplNG, nil); 
      t.Execute(r[0], os.Stdout); 
   }
 }else{
   t := template.MustParse(tplFailure, nil); 
   t.Execute("NAME", os.Stdout); 
 }

} 
				

上記と同じ動きをするCGIを、templeteパッケージを使ってヒアドキュメント形式でWEBページを作成して出力

©2010 Tugu Katagiri

WindowsでGo言語
のまとめ

このページはIE8で動作を確認しています。

Internet Explorer 8 をダウンロード
Firefox ブラウザ無料ダウンロード