web-dev-qa-db-ja.com

golangテンプレート内にforループを実装する

私はGolangで作業していますが、現在、select内に少なくとも20個のオプションを出力する必要があるため、0から20までのループを使用する必要があります(インデックスを取得するため)。

Golangテンプレート内でforループを使用するにはどうすればよいですか?

テンプレート内に一連の数字を生成する必要があります。繰り返す配列がありません。

編集:次のようなものを取得する必要があります:

<select>
     <option value="1">1</option>
     <option value="2">2</option>
     <option value="3">3</option>
     <option value="4">4</option>
</select>

だから、私はコードで次のようなことをする必要があります:

<select>
     {{for i := 1; i < 5; i++}}
        <option value="{{i}}">{{i}}</option>
     {{end}}
</select>

しかし、これは機能しません

7

テンプレートでもrangeを使用できます。 https://golang.org/pkg/text/template/#hdr-Variables を参照してください

最も簡単なオプションは、オプションを含むスライスを使用することです。

func main() {
    const tmpl = `
<select>
{{range $val := .}}
     <option value="{{$val}}">{{$val}}</option>
{{end}}
</select>
`
    t := template.Must(template.New("tmpl").Parse(tmpl))

    t.Execute(os.Stdout, []int{1, 2, 3})
}
5
jayme

最善の策は、func_mapに「Iterate」関数を追加することです。

template.FuncMap{
        "Iterate": func(count *uint) []uint {
            var i uint
            var Items []uint
            for i = 0; i < (*count); i++ {
                Items = append(Items, i)
            }
            return Items
        },
}

関数マップをtext/templateに登録すると、次のように繰り返すことができます。

{{- range $val := Iterate 5 }}
  {{ $val }}
{{- end }}

この便利な関数が、text/templateが提供するデフォルトの関数セットの一部ではない理由がわかりません。たぶん彼らは将来似たようなものを追加するでしょう。

4
Jonathan Mayer