Go言語でのWebアプリ開発学習その4~標準ライブラリのHTMLテンプレートにマップ渡す

前回 ( https://note.com/yasmizohawks/n/nbce30969b4d1 ) に引き続き
Go言語でのWebアプリ開発についていろいろ見てみます。
今回は標準ライブラリのHTMLテンプレートでのマップの渡し方を見てみます。

■ マップをHTMLテンプレートへ渡す

前回 ( https://note.com/yasmizohawks/n/nbce30969b4d1 ) は
構造体をHTMLテンプレートへ渡すサンプルを作りましたが
今回はキーとバリューのコレクションであるマップを
HTMLテンプレートへ渡したいと思います。

ファイルの配置は以下になります。

【サンプルソース置き場】ディレクトリ
 ┣ htmlTemp04.go
 ┗ htmlTempSample03.html

それぞれのファイルの内容は以下になります。

  • HTMLテンプレートにデータを埋め込む htmlTemp04.go

package main

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

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

func executeTemplate(w http.ResponseWriter, r *http.Request) {
	userInfoMap := map[string]string{
		"userName":"溝口泰成",
		"age":"53",
		"sex":"男性",
	}

	t := template.Must(template.ParseFiles("./htmlTempSample03.html"))

	if err := t.Execute(w, userInfoMap); err != nil {
		panic(err)
	}
}

executeTemplate 関数の以下の部分で
マップ型変数の宣言と初期化を同時にやってます。

userInfoMap := map[string]string{
  "userName":"溝口泰成",
  "age":"53",
  "sex":"男性",
}

とりあえずキーもバリューもどちらも string 型にしてます。
構造体のときは、以下のように変数名の先頭を大文字にする必要がありました。

type UserInfo struct {
  UserName string
  Age int
  Sex string
}

変数の先頭を大文字にしないとパッケージの外から
変数にアクセスできないためにそうしたのですが、
マップにおける「構造体内の変数名」に該当する「キー名」は
「変数ではなく値」なので、大文字にする必要はありません。

※ HTMLテンプレートから「変数名で参照する」場合は
  パッケージ外からのアクセス制限がからんできますが
  HTMLテンプレートから「値で参照する」場合は
  アクセス制限の影響はないということです

なので、
"userName":"溝口泰成"
の「userName」の先頭はあえて小文字にしてます。

executeTemplate 関数の以下の行で
Execute 関数の第二引数にマップ型の変数 userInfoMap を渡してます。

if err := t.Execute(w, userInfoMap); err != nil {

  • HTMLテンプレートファイル htmlTempSample03.html

<!DOCTYPE html>
<html>
	<head>
		<title>sample</title>
	</head>
	<body>
		<p>名前:{{.userName}}</p>
		<p>年齢:{{.age}}</p>
		<p>性別:{{.sex}}</p>
	</body>
</html>

以下の部分で
{{.【マップのキー名】}} という記載をすることで
マップのバリュー値が表示されます。

<p>名前:{{.userName}}</p>
<p>年齢:{{.age}}</p>
<p>性別:{{.sex}}</p>

実行してみます。

まずは、htmlTemp04.go (HTTPサーバ)を起動

>go run htmlTemp04.go

続いてブラウザでURLに「http://localhost:8080/」を指定して確認

マップの各キーに設定したバリュー値が表示されました。

次回も引き続き標準ライブラリのHTMLテンプレートについて見ていきます。

#プログラミング
#IT
#プログラミング言語
#Go言語
#GO
#Golang
#Webアプリケーション開発

いいなと思ったら応援しよう!