ホームページ  >  記事  >  バックエンド開発  >  Golang テンプレート範囲の最後の要素を検出するにはどうすればよいですか?

Golang テンプレート範囲の最後の要素を検出するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-07 13:22:02970ブラウズ

How to Detect the Last Element in a Golang Template Range?

テンプレート範囲内の最後の要素の検出

Golang テキスト テンプレートでは、range ディレクティブはコレクション内の要素を反復処理し、次の要素へのアクセスを提供します。現在の要素とそのインデックス。このメカニズムは効率的なループを促進しますが、シーケンス内の最後の要素を識別するときに課題が生じます。

問題:

テンプレートを検討してください:

{{range $i, $e := .SomeField}}
    {{if $i}}, {{end}}
    $e.TheString
{{end}}

デフォルトでは、このテンプレートは要素のカンマ区切りリストを出力します。

one, two, three

ただし、最後の要素の前に「and」を付けて人間が判読できる出力を生成するには、範囲の最後のインデックス。

解決策:

算術演算はテンプレートでは直接サポートされていませんが、回避策として Go のリフレクト パッケージを使用することが必要です:

package main

import (
    "os"
    "reflect"
    "text/template"
)

var fns = template.FuncMap{
    "last": func(x int, a interface{}) bool {
        return x == reflect.ValueOf(a).Len() - 1
    },
}


func main() {
    t := template.Must(template.New("abc").Funcs(fns).Parse(`{{range  $i, $e := .}}{{if $i}}, {{end}}{{if last $i $}}and {{end}}{{$e}}{{end}}.`))
    a := []string{"one", "two", "three"}
    t.Execute(os.Stdout, a)
}

このソリューションでは、テンプレートの関数マップの最後に Go 関数が導入されています。この関数は現在のインデックスとコレクションを引数として受け取り、インデックスがコレクションの長さから 1 を引いた値に等しい場合に true を返します。

この関数をテンプレートに組み込むことで、最後の要素を区別して目的の要素を出力できます。 result:

one, two, and three

補足:

別のアプローチでは、len 関数を利用して、リフレクションを必要とせずにテンプレート内のコレクションの長さを計算します。

{{range  $i, $e := .}}{{if $i}}, {{end}}{{if eq $i (len $)}}and {{end}}{{$e}}{{end}}.`

以上がGolang テンプレート範囲の最後の要素を検出するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。