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

Go テンプレート範囲内の最後の項目を検出するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-08 06:24:011074ブラウズ

How to Detect the Last Item in a Go Template Range?

テンプレート範囲内の最後の項目の検出

Go テンプレートでは、範囲アクションを使用して配列またはスライスを反復処理すると、次の項目に簡単にアクセスできます。配列要素。ただし、場合によっては、最後の反復を他の反復と区別することが必要になります。

範囲内の最後の要素に個別の書式設定を必要とするテンプレートを検討してください。

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

このテンプレートは出力を生成します。 like:

one, two, three

この動作を変更し、最後の前に「and」を出力するにはelement:

one, two, and three

範囲内のどの要素が最後であるかを判断する必要があります。

テンプレートの外側で配列の長さを追跡することは可能ですが、このメソッドでは配列の長さの変化を考慮しない静的な値です。

解決策は、テンプレートに対する 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)
}

このアプローチでは、リフレクションを利用して配列の長さを動的に決定し、現在のインデックス $i と比較します。インデックスが配列の長さから 1 を引いた値と一致する場合、last 関数は true を返し、現在の要素が範囲内の最後であることを示します。

代わりに、リフレクションなしで len 関数を使用することもできます。

package main

import (
    "os"
    "text/template"
)

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

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

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