まだプログラマーですが何か?

プログラマーネタ中心。たまに作成したウェブサービス関連の話も https://twitter.com/dotnsf

タグ:go

前回の続きです:
CentOS に Go をインストールする


Go の実行環境が導入できたので、テンプレートエンジンを使ってみます。まずは HTML テンプレートを作成しておきます。base.html というファイル名で以下の内容を作成/保存します:
{{define "base"}}<!doctype html>
<html>
<head>
<meta charset="utf-8"/>
<title>{{.Title}}</title>
</head>
<body>
<div class="content">
<h1>{{.Title}}</h1>
<hr/>
<div>
{{.Body|safehtml}}
</div>
</div>
</body>
</html>{{end}}

↑ほぼ HTML ですが、赤字で書いた部分が変数になります。変数名としては Title と Body の2つがあり、その中身はこの後の Go アプリの中で定義して渡します。また全体を "base" という名前で定義しています(青字部分)。


次にこのテンプレートを使って画面を表示する Go のウェブアプリを作成します(http2.go というファイル名で、base.html と同じディレクトリに作成します):
package main

import(
  "net/http"
  "html/template"
)

func viewHandler( w http.ResponseWriter, req *http.Request ){
  funcMap := template.FuncMap{
    "safehtml": func(text string) template.HTML { return template.HTML(text) },
  }
  templates := template.Must(template.New("").Funcs(funcMap).ParseFiles("base.html"))
  dat := struct {
    Title string
    Body string
  }{
    Title: req.FormValue( "title" ),
    Body: req.FormValue( "body" ),
  }
  err := templates.ExecuteTemplate(w, "base", dat)
  if err != nil {
    http.Error( w, err.Error(), http.StatusInternalServerError )
  }
}

func main(){
  http.HandleFunc( "/", viewHandler )
  http.ListenAndServe( ":8080", nil )
}

基本形は前回の Go ウェブアプリとほぼ同じですが、まず html/template を使う宣言をして、テンプレートに上記で作成した(同じディレクトリ上にある) base.html を使う宣言をしています。

またテンプレート内の変数 Title, Body を、それぞれ title, body という URL パラメータを受け取って定義するようにしています。

この状態で http2.go を実行します:
# go run http2.go


そしてウェブブラウザでこのサーバーの 8080 番ポートのルートパスに、パラメータ title と body を指定してアクセスすると、指定した内容がウェブページの一部になって表示されるはずです:
2016042602


これで Go でもテンプレートエンジンっぽいこともできました。

CentOS に Go 言語環境を導入します。以下は CentOS 6.x の 64bit 版を前提とします。


Go 言語のインストールは yum ではなく、直接バイナリをダウンロードして展開するだけです(この例では /usr/local/go/ 以下に Go 1.4 をインストールしています):
# cd /usr/local/src
# wget https://storage.googleapis.com/golang/go1.4.linux-amd64.tar.gz
# tar -C /usr/local -xzf go1.4.linux-amd64.tar.gz

環境変数 GOPATH を設定し、また PATH を通してコマンドラインから直接利用できるように設定します:
# vi ~/.bashrc

(以下の2行を追加して保存)
export GOPATH=/usr/local/go/
export PATH=$PATH:/usr/local/go/bin

ここまでの準備ができたらログインし直して、go コマンドを実行して動作確認します(青字のような出力になれば成功です):
# go version
go version go1.4 linux/amd64

試しに Hello World 的なアプリを書いて実行してみましょう。以下の内容のテキストファイルを hello.go という名前で作成して保存します:
package main

import "fmt"

func main(){
  fmt.Printf( "Hello, World\n" )
}

そして実行して動作を確認します:
# go run hello.go
Hello World

動きました!


ついでに HTTP サーバーを作ってみます。今度は以下の内容を http1.go という名前で作成します。8080 番ポートのルートパス(/)で待ち受けるような内容にしています。また GET の param パラメータの値を取り出して出力するようにしています:
package main

import(
  "fmt"
  "html"
  "net/http"
)

func HelloServer( w http.ResponseWriter, req *http.Request ){
  title := html.EscapeString( req.URL.Path[1:] )
  param := req.FormValue( "param" )
  output := `
<html>
<head>
<title>` + title + `</title>
</head>
<body>
<h1>HTTP のテスト</h1>
<h2>get</h2>
param=` + html.EscapeString(param) + `</br>
</body>
</html>
`
  fmt.Fprintf( w, "%s", output )
}

func main(){
  http.HandleFunc( "/", HelloServer )
  http.ListenAndServe( ":8080", nil )
}

そして実行します:
# go run http1.go


ウェブブラウザで、この Go を実行中のマシンの 8080 番ポートのルートパス(/)にアクセスします。またこの時に param パラメータを付けて実行すると、そのパラメータ内容が表示されることを確認します:
2016042601


CentOS 上で Go 言語が実行でき、HTTP サーバーを作れることも確認できました。

このページのトップヘ