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


WEBサーバー

単純なWEBサーバーの構築

ポート8080で動作するWEBサーバー

package main

import (
 "http"
 "io"
)

func formPage(c *http.Conn, req *http.Request) {

 const myHtml = ` 
   <HTML>
   <BODY>
   <form method="get" action="main.cgi">
   <INPUT TYPE="TEXT" NAME="Name" value="ダンボハナアルキ">
   <INPUT TYPE="submit" VALUE="送信">
   </form>
   </BODY>
   </HTML>
` 
   io.WriteString(c, myHtml);
}

func main() {
   http.Handle("/", http.HandlerFunc(formPage));
   err := http.ListenAndServe(":8080", nil);
   if err != nil { panic("ListenAndServe: ") }
   }
					

コンパイル後、main.exeを実行するとWEBサーバーとしてクライアントからの応答を待ちます。 ブラウザから「http://localhost:8080」とアドレス指定すると、HTMLコードがブラウザに送信されるしくみです。

WEBサーバーにCGIの応答を追加

先ほどのWEBサーバーにCGI応答の動作を追加します。http.Handleに処理関数ポインタを追加すればOK。

package main

import (
 "http"
 "io"
 "cgi1"
)

func formPage(c *http.Conn, req *http.Request) {

 const myHtml = ` 
   <HTML>
   <BODY>
   <form method="get" action="main.cgi">
   <INPUT TYPE="TEXT" NAME="Name" value="ダンボハナアルキ">
   <INPUT TYPE="submit" VALUE="送信">
   </form>
   </BODY>
   </HTML>
` 
   io.WriteString(c, myHtml);
}

func maincgiPage(c *http.Conn, req *http.Request) {
 
 cgi1.CgiMain(c,req)
 
}

func main() {
   http.Handle("/", http.HandlerFunc(formPage));
   http.Handle("/main.cgi", http.HandlerFunc(maincgiPage));
   err := http.ListenAndServe(":8080", nil);
   if err != nil { panic("ListenAndServe: ") }
   }
					

応答するCGI処理は今までのWEBCGIプログラムと同じ。

package cgi1

import ( 
 "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 CgiMain(c *http.Conn,req *http.Request) { 

   // httpパッケージを使ってNameフィールドの値を取得
   r := req.FormValue("Name")

   // 結果に従って、あらかじめ作っておいたテンプレートを出力
   if r != "" {

      gh,e := GetHanaaruki(r)

      if e{
         t := template.MustParse(tplOK, nil); 
         t.Execute(gh, c); 
      }else{
         t := template.MustParse(tplNG, nil); 
         t.Execute(r, c); 
      }

   }else{
      t := template.MustParse(tplFailure, nil); 
      t.Execute("NAME", c); 
   }

}
				

今回は、main処理パッケージファイル「main.go」とCGI処理パッケージ「cgi1.go」の2ファイルを作成。 パッケージを自作するには、1行目のパッケージ名を指定してソースを作成し、パッケージ名ををmain関数でimportして、ファイルをプロジェクト内に含めればOK。

現時点では、XXX.a のようなライブラリファイルは作成できませんが、ソースのIncludeはできるので、これで対応可能です。

©2010 Tugu Katagiri

WindowsでGo言語
のまとめ

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

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