Распечатать текущий индекс среза при повторении с использованием пакета html/template

Я пытаюсь распечатать текущий индекс фрагмента при повторении с использованием пакета html/template с Revel, но не получаю ожидаемого результата.

Мое действие:

func (c App) Index() revel.Result {
    test_slice := []string{"t", "e", "s", "t"}

    return c.Render(test_slice)
}

Мой шаблон:

{{range $i, $test_slice := .}}
    {{$i}}
{{end}}

Вместо того, чтобы получить 0 1 2 3,

я получаю DevMode RunMode currentLocale errors flash test_slice session title

Что я сделал не так ?


person oxidec    schedule 18.12.2013    source источник


Ответы (1)


Боюсь, вы не перебираете массив test_slice. Если бы вы это сделали, ваш код выглядел бы примерно так:

package main

import (
    "os"
    "html/template"
)

const templateString = `{{range $i, $test_slice := .}}
    {{$i}}
{{end}}`

func main() {
    t, err := template.New("foo").Parse(templateString)
    if err != nil {
        panic(err)
    }

    test_slice := []string{"t", "e", "s", "t"}

    err = t.Execute(os.Stdout, test_slice)
    if err != nil {
        panic(err)
    }
}

Вывод:

    0

    1

    2

    3

Ваш код скорее перебирает карту, где test_slice является лишь одним из значений. То, что вы видите, — это ключевые имена этой карты, где test_slice — одно из них. Чтобы заставить его работать, вы должны изменить свой шаблон на:

{{range $i, $test_slice := .test_slice}}
    {{$i}}
{{end}}

Рассмотрим этот пример Playground: http://play.golang.org/p/are5JNPXt1.

person ANisus    schedule 18.12.2013
comment
Спасибо, это имеет смысл! - person oxidec; 18.12.2013