Доступ к первому элементу отсортированного списка пар

Я новичок в Go Templates и пытаюсь получить доступ к первому элементу в списке SortedPair. Я пробовал {{ (index .Labels.SortedPairs 1)}}{{ .Name }} = {{ .Value }}, но это не работает, я получаю can't evaluate field Name in type template.Alert.

Есть ли способ получить самый первый элемент? Когда это {{range}}, он работает нормально, но отображает слишком много элементов.

Спасибо


person iso123    schedule 06.04.2017    source источник
comment
Вы можете создать функцию или метод, который возвращает первую пару, и вызвать ее из шаблона. См. stackoverflow.com/questions/ 10200178/   -  person RayfenWindspear    schedule 06.04.2017


Ответы (1)


Обратите внимание, что первый индекс 0, а не 1.

Вы можете индексировать список как при отображении его Name, так и Value:

{{(index .Labels.SortedPairs 0).Name}} = {{(index .Labels.SortedPairs 0).Value}}

Это короче, если вы присвоите его переменной:

{{$first := index .Labels.SortedPairs 0}}{{$first.Name}} = {{$first.Value}}

И еще понятнее, если вы используете действие {{with}}:

{{with index .Labels.SortedPairs 0}}{{.Name}} = {{.Value}}{{end}}

Протестируем 3 варианта:

type Pair struct {
    Name, Value string
}

var variants = []string{
    `{{$first := index .SortedPairs 0}}{{$first.Name}} = {{$first.Value}}`,
    `{{(index .SortedPairs 0).Name}} = {{(index .SortedPairs 0).Value}}`,
    `{{with index .SortedPairs 0}}{{.Name}} = {{.Value}}{{end}}`,
}

m := map[string]interface{}{
    "SortedPairs": []Pair{
        {"first", "1"},
        {"second", "2"},
    },
}

for _, templ := range variants {
    t := template.Must(template.New("").Parse(templ))
    if err := t.Execute(os.Stdout, m); err != nil {
        panic(err)
    }
    fmt.Println()
}

Результат (попробуйте на Go Playground):

first = 1
first = 1
first = 1
person icza    schedule 06.04.2017
comment
И еще понятнее, если вы напишете простые функции, которые позволят вам писать еще более простые шаблоны; ) - person RayfenWindspear; 06.04.2017
comment
Отлично, спасибо! Извините, я пока не могу проголосовать, недостаточно представителей - person iso123; 06.04.2017