Hugoには、複数のデータを1つにまとめて扱える「スライス(可変配列)」があります。
今回は、スライスの使い方と関数の使い方を解説します。

スライスとは?

Hugoで使えるコレクションの1種で、サイズが可変の配列です。
他のプログラミング言語では、ListとかArrayListとかVectorとか呼ばれています。

スライスを生成する

Hugoでスライスを生成する方法は3種類あります。

要素を指定してスライスを生成する

最も一般的な方法です。

Hugoでスライスを生成するときはslice関数を使用します。
slice関数の後に、スライスの要素を指定します(要素数0もできます)。

{{ slice <Element> <Element> <Element> ... }}
Element
スライスの要素をスペース区切りで指定します。
要素を1つも指定しないときは、要素数0のスライスを生成します。

スライスの型付けは、すべての型を格納できるinterface{}型です。
そのため、スライスの要素は複数の型を混ぜることができます。

要素数0のスライス
{{ slice }}

文字列のスライス
{{ slice "Google" "Amazon" "Facebook" "Apple" "Microsoft" }}

数値のスライス
{{ slice 1 2 3 4 }}

Nilのスライス
{{ slice nil nil nil }}

スライスのスライス
{{ slice (slice "Google" "Amazon" "Facebook" "Apple" "Microsoft") (slice "Baidu" "Alibaba" "Tencent" "Huawei") }}

マップのスライス
{{ slice (dict "GAFA" "Google Amazon Facebook Apple") (dict "BATH" "Baidu Alibaba Tencent Huawei") }}

複数の型を混ぜたスライス
{{ slice "文字列" 1 nil (slice "スライス") (dict "キー" "マップ") }}

等差数列のスライスを生成する

要素が等差数列であるスライスを生成するときに使用できます。

seq関数は整数のスライスを作成します。

この関数はパラメーターの個数により動作が変わります。
0からLastまでのスライス
{{ seq <Last> }}

FirstからLastまでのスライス
{{ seq <First> <Last> }}

FirstからLastまで公差がToleranceのスライス
{{ seq <first> <Tolerance> <Last> }}
First
等差数列の開始値を指定します。 デフォルトは0です 。
Tolerance
等差数列の公差を指定します。 デフォルトは1です。
Last
等差数列の終了値を指定します。

文字列からスライスを生成する

文字列からスライスを生成するときに使用できます。

split関数は文字列を区切り文字で区切ったスライスを作成します。

{{ split <String> <Delim> }}
String
スライスを生成する文字列を指定します。
Delim
文字列の区切り文字を指定します。

スライスの基本操作

スライスの基本操作を解説します。

スライスの指定した位置にある要素を取得する

スライスの指定した位置にある要素を取得するにはindex関数を使用します。

{{ index <Slice> <Index> }}
Slice
要素を取得したいスライスを指定します。
Index
取得したい要素の添え字を指定します。
スライスの添え字について
添え字は0から始まります。
すなわち、先頭の要素は「0番目」です。

スライスをループで処理する

スライスの全要素を取得するにはrange関数を使用します。

{{ range <Slice> }}

ブロック内では、ドットを参照することで各要素を取得できる。
{{ . }}

{{ end }}
Slice
ループで処理をしたいスライスを指定します。

range関数は、2つの変数を使用すると添え字と要素を同時に取得できます。

{{ range $index, $value := <Slice> }}

$indexを参照すると、現在の要素の添え字が取得できる
{{ $index }}

$valueを参照すると、現在の要素を取得できる
{{ $value }}

{{ end }}
スライスの全要素に関数を適用させたいときはapply関数を使用すると簡潔です。

スライスの指定した位置に要素が存在するか調べる

スライスの指定した位置に要素が存在するか調べるにはisset関数を使用します。

{{ isset <Slice> <index> }}
Slice
調べたいスライスを指定します。
INDEX
要素が存在するか調べたい位置を指定します。

スライスに指定した要素が含まれるか調べる

スライスに指定した要素が含まれるか調べるにはin関数を使用します。

{{ in <Slice> <Element> }}
Slice
調べたいスライスを指定します。
Element
含まれるか調べる要素を指定します。

スライスの要素数を取得する

スライスの要素数を取得するにはlen関数を使用します。

{{ len <Slice> }}
Slice
要素数を取得したいスライスを指定します。

スライスのユーティリティ関数

スライスのユーティリティ関数を紹介します。

スライスをソートする

スライスを降順ソートまたは昇順ソートするときはsort関数を使用します。

{{ sort <Slice> "value" <Option> }}
Slice
ソートしたいスライスを指定します。
Option
降順、昇順を指定します。
デフォルトは昇順でソートします。
降順でソートする
{{ sort (slice 3 2 1 4) "value" "desc" }}

昇順でソートする
{{ sort (slice 2 1 4 3) "value" "asc" }}

昇順ソートのときは、オプションを省略できる
{{ sort (slice 1 2 4 3 ) }}
オプションの指定について
descを指定すると降順でソートします。
大小区別をするため、必ず小文字で指定してください。
これ以外の値(未指定含む)を指定すると、昇順でソートします。

ランダムに並び変える

スライスの全要素をランダムに並び替えたいときはshuffle関数を使用します。

{{ shuffle <Slice> }}
Slice
要素をランダムに並び替えたいスライスを指定します。

全要素に関数を適用する

スライスの全要素を対象に関数を適用させたいときはapply関数を使用します。

{{ apply <Slice> <Function> <Param> }}
Slice
関数を適用させるスライスを指定します。
Function
スライスに適用させる関数を文字列で指定します。
Param
適用させる関数がパラメーターを必要とするときはパラメーターを指定します。

スライスの重複要素を除く

スライスの重複要素を除いて、すべての要素を単一にするにはuniq関数を使用します。

{{ uniq <Slice> }}
Slice
重複する要素を除きたいスライスを指定します。

SQLを使用してスライスをフィルターする

SQLを使用してスライスをフィルターするにはwhere関数を使用します。

{{ where <Slice> <Option> }}
Slice
SQLを適用させたいスライスを指定します。
Option
SQLを指定します。
Googleだけをフィルターする
{{ where (slice "Google" "Amazon" "Facebook" "Apple" "Microsoft") "eq" "Google" }}

Amazonを除外する
{{ where (slice "Google" "Amazon" "Facebook" "Apple" "Microsoft") "ne" "Amazon" }}

Facebookを含まないか調べる
{{ where (slice "Google" "Amazon" "Facebook" "Apple" "Microsoft") "not in" "Facebook" }}

2つのスライスの操作

スライスの末尾に要素を追加する(和集合)

スライスの末尾に1つ以上の要素を追加するときはappend関数を使用します。
数学集合の言葉を借りると「和集合」です。

値を指定するとき
{{ <Slice> | append <Value> ... }}

スライスまたはマップを指定するとき
{{ <Slice> | append <Collection> }}
Slice
要素を追加したいスライスを指定します。
Value
追加したい要素を指定します。
2つ以上追加するときは、スペース区切りで指定します。
Collection
追加したいコレクションを指定します。
スライスのときは、スライス内の要素を追加します(入れ子にはなりません)。
マップのときは、マップ自身を1つの要素として追加します(マップが入れ子になります)。

2つのスライスの共通要素を取得する(積集合)

2つのスライスの共通要素を取得するには。intersect関数を使用します。

{{ intersect <Slice> <Slice> }}
Slice
共通要素を取得する2つのスライスを指定します。

2つのスライスを結合して共通要素を削除する(対象差)

2つのスライスの結合と共通要素の削除を同時に行うにはsymdiff関数を使用します。

{{ symdiff <Slice> <Slice> }}
Slice
結合して共通要素を削除するスライスを指定します。

スライスを結合して重複する要素を1つだけにする

2つのスライスの結合と重複する要素の除外を同時に行うにはunion関数を使用します。
append関数とuniq関数の複合関数です。

{{ union <Slice> <Slice> }}
Slice
結合する2つのスライスを指定します。
重複する要素は1つだけ含むようにします。

スライスの抜き出しを行う

先頭または末尾からスライスの抜き出しを行う

first関数とlast関数はスライスの抜き出しを行います。

first関数は、先頭から指定した要素数だけ抜き出します。
last関数は、末尾から指定した要素数だけ抜き出します。

{{ first <Count> <Slice> }}
{{ last <Count> <Slice> }}
Slice
抜き出しを行うスライスを指定します。
Count
抜き出す要素数を指定します。

指定した位置より後ろにある要素を取得する

after関数はスライスの指定した位置より後ろにある要素を取得します。

{{ after <Index> <Slice> }}
Index
要素の取得をしたい開始位置を指定してください。
Slice
要素を取得するスライスを指定してください。