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テンプレートについて見ていきます。

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

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