Go言語でのWebアプリ開発学習その12~標準ライブラリのHTMLテンプレートのアクション:range その2
前回 ( https://note.com/yasmizohawks/n/n2de491a7e992 ) に引き続き
Go言語でのWebアプリ開発についていろいろ見てみます。
今回は標準ライブラリのHTMLテンプレートのアクションの
range におけるループ処理の制御について見てみます。
■ else を使って要素数チェック
range は配列などのコレクションから値を1つ1つ取り出して処理するものですが、
コレクションに1つも値が存在しない、
要素数がゼロの場合も想定しないといけませんね。
たとえば、検索キーワードに一致するデータが無い場合に
「該当するデータが存在しません」といったメッセージを表示したい場合などです。
要素数がゼロの場合も想定する場合には else を使います。
サンプル作ってみましょう。
各ファイルの配置は以下になります。
【サンプルソース置き場】ディレクトリ
┣ htmlTemp13.go
┗ htmlTempSample12.html
HTMLテンプレートにデータを埋め込む htmlTemp13.go
package main
import (
"html/template"
"os"
"fmt"
)
func main() {
fmt.Println("\n★★★ 配列が空の場合 ★★★\n")
var sampleIntArray []int
t := template.Must(template.ParseFiles("./htmlTempSample12.html"))
if err := t.Execute(os.Stdout, sampleIntArray); err != nil {
panic(err)
}
fmt.Println("\n\n★★★ 配列が空でない場合 ★★★\n")
sampleIntArray = []int{1, 2, 3, 4, 5}
if err := t.Execute(os.Stdout, sampleIntArray); err != nil {
panic(err)
}
}
まず、要素数ゼロの配列をHTMLテンプレートに渡します。
fmt.Println("\n★★★ 配列が空の場合 ★★★\n")
var sampleIntArray []int
t := template.Must(template.ParseFiles("./htmlTempSample12.html"))
if err := t.Execute(os.Stdout, sampleIntArray); err != nil {
panic(err)
}
上記 sampleIntArray に配列を設定していないので
sampleIntArray は要素数がゼロになります。
次に、値が格納された配列をHTMLテンプレートに渡します。
fmt.Println("\n\n★★★ 配列が空でない場合 ★★★\n")
sampleIntArray = []int{1, 2, 3, 4, 5}
if err := t.Execute(os.Stdout, sampleIntArray); err != nil {
panic(err)
}
HTMLテンプレートファイル htmlTempSample12.html
<!DOCTYPE html>
<html>
<head>
<title>sample</title>
</head>
<body>
{{ range . -}}
{{ . }}
{{ else -}}
該当するデータが存在しません
{{ end }}
</body>
</html>
range 部分は以下になります。
{{ range . -}}
{{ . }}
{{ else -}}
該当するデータが存在しません
{{ end }}
htmlTemp13.go から配列が
{{ range . -}}
の 「 . 」(ピリオド)部分に渡されますが
配列の要素数がゼロの場合は
{{ else -}}
の下の行の文字列「該当するデータが存在しません」
が表示されます。
実行してみます。
>go run htmlTemp13.go
★★★ 配列が空の場合 ★★★
<!DOCTYPE html>
<html>
<head>
<title>sample</title>
</head>
<body>
該当するデータが存在しません
</body>
</html>
★★★ 配列が空でない場合 ★★★
<!DOCTYPE html>
<html>
<head>
<title>sample</title>
</head>
<body>
1
2
3
4
5
</body>
</html>
配列の要素数がゼロの場合は
「該当するデータが存在しません」
が表示されてますね。
■ break でループ終了
プログラム言語のループ文は
「ある条件のときはループを終了する」
ことが出来たりしますが
Go の HTMLテンプレートでも同じことが出来ます。
break を使います。
サンプル作ってみましょう。
各ファイルの配置は以下になります。
【サンプルソース置き場】ディレクトリ
┣ htmlTemp14.go
┗ htmlTempSample13.html
HTMLテンプレートにデータを埋め込む htmlTemp14.go
package main
import (
"html/template"
"os"
)
func main() {
sampleIntArray := []int{1, 2, 3, 4, 5}
t := template.Must(template.ParseFiles("./htmlTempSample13.html"))
if err := t.Execute(os.Stdout, sampleIntArray); err != nil {
panic(err)
}
}
整数 1 から 5 まで入った配列をHTMLテンプレートに渡します。
sampleIntArray := []int{1, 2, 3, 4, 5}
t := template.Must(template.ParseFiles("./htmlTempSample13.html"))
if err := t.Execute(os.Stdout, sampleIntArray); err != nil {
panic(err)
}
HTMLテンプレートファイル htmlTempSample13.html
<!DOCTYPE html>
<html>
<head>
<title>sample</title>
</head>
<body>
{{ range . -}}
{{if eq . 4}}
{{break}}
{{end}}
{{- . }}
{{ end }}
</body>
</html>
ポイントは以下の部分です。
{{if eq . 4}}
{{break}}
{{end}}
{{if eq . 4}}
の「 . 」(ピリオド)部分には htmlTemp14.go から渡された
配列内の整数値が設定されますが
この整数値が「 4 」になったら
{{break}}
によって range ループが終了します。
なので、1 ~ 3 まで出力され、
4 ~ 5 は出力されません。
実行してみます。
>go run htmlTemp14.go
<!DOCTYPE html>
<html>
<head>
<title>sample</title>
</head>
<body>
1
2
3
</body>
</html>
1 ~ 3 までしか出力されてませんね。
■ continue でループスキップ
プログラム言語のループ文は
「ある条件のときは、そのときに処理対象となっている
コレクション要素の処理をスキップして次の要素の処理に移る」
ことが出来たりしますが
Go の HTMLテンプレートでも同じことが出来ます。
continue を使います。
サンプル作ってみましょう。
各ファイルの配置は以下になります。
【サンプルソース置き場】ディレクトリ
┣ htmlTemp15.go
┗ htmlTempSample14.html
HTMLテンプレートにデータを埋め込む htmlTemp15.go
package main
import (
"html/template"
"os"
)
func main() {
sampleIntArray := []int{1, 2, 3, 4, 5}
t := template.Must(template.ParseFiles("./htmlTempSample14.html"))
if err := t.Execute(os.Stdout, sampleIntArray); err != nil {
panic(err)
}
}
前述のサンプル htmlTemp14.go とほぼ同じで、
対象のテンプレートが
htmlTempSample14.html
に変わっただけです。
HTMLテンプレートファイル htmlTempSample14.html
<!DOCTYPE html>
<html>
<head>
<title>sample</title>
</head>
<body>
{{ range . -}}
{{if eq . 4 -}}
{{continue -}}
{{end}}
{{- . }}
{{ end }}
</body>
</html>
ポイントは以下の部分です。
{{if eq . 4 -}}
{{continue -}}
{{end}}
{{if eq . 4 -}}
の「 . 」(ピリオド)部分には htmlTemp15.go から渡された
配列内の整数値が設定されますが
この整数値が「 4 」になったら
{{continue -}}
によってループ処理である値の表示 ( {{- . }} ) がスキップされるため
「 4 」は表示されずに次の値である「 5 」が表示されます。
実行してみます。
>go run htmlTemp15.go
<!DOCTYPE html>
<html>
<head>
<title>sample</title>
</head>
<body>
1
2
3
5
</body>
</html>
1 ~ 3 の次は 4 ではなく 5 になってますね。
次回も引き続き標準ライブラリのHTMLテンプレートについて見ていきます。