Поддерживать неупорядоченную итерацию по карте в шаблонах Go

Моя проблема: у меня есть тип карты [string] Type, который я хочу перебрать в шаблоне, сохраняя поведение случайного упорядочения более широкого языка.

Библиотека шаблонов Go указана здесь https://golang.org/pkg/text/template/#hdr-Actions, которые:

Если значением является карта, а ключи имеют базовый тип с определенным порядком («сопоставимые»), элементы будут посещаться в порядке отсортированных ключей.

Я знаю, что могу обойти это, объявив отдельную [] строку ключей в исходной карте, а затем повторив это, то есть:

data := map[string]DummyStruct{}
data["Windward"] = DummyStruct{"Windward", 15}
data["Phlebas"] = DummyStruct{"Phlebas", 3}
data["Art"] = DummyStruct{"Art", 3}
i := 0
indices := make([]string, len(data))
for name, value := range data {
        fmt.Printf("%v, %v\n", name, value)
    indices[i] = name
    i ++
}

однако я надеялся, что это будет полностью нативная поддерживаемая функция библиотеки шаблонов, чтобы соответствовать поведению на более широком языке, однако, похоже, она вообще не поддерживается.

См. Playground здесь для полного примера: https://play.golang.org/p/1oTI56G5pr9


person gjtempleton    schedule 23.10.2018    source источник
comment
Вы можете найти мой ответ на этот вопрос полезным: карта из sorting">stackoverflow.com/questions/52469714/   -  person Vorsprung    schedule 23.10.2018
comment
У меня есть тип карты[string]Type, который я хочу перебрать в шаблоне по порядку (т. е. сохранить существующий порядок). Нет существующего порядка, карты неупорядочены. Если вы перебираете карту в Go, порядок будет случайным. См. Почему Go не может перебирать карты в порядке вставки? ; и Map in order range loop.   -  person icza    schedule 23.10.2018
comment
Причина полностью неупорядоченной итерации по карте, как при использовании диапазона в более широком языке, заключается в том, что карты по своей сути неупорядочены. Шаблоны ничего не могут сделать, чтобы изменить этот факт.   -  person Adrian    schedule 23.10.2018
comment
Извините, я немного уточнил мою формулировку, чтобы прояснить, что я надеялся использовать неупорядоченное поведение, а не порядок, который навязывает функция диапазона пакета шаблона.   -  person gjtempleton    schedule 23.10.2018
comment
Какую проблему ты пытаешься решить?   -  person Emile Pels    schedule 23.10.2018
comment
К сожалению для вас, именно так механизм шаблонов выглядит реализован, так что вам придется заполнить фрагмент в порядке, заданном диапазоном карт (вы можете сделать это в шаблоне, используя пользовательскую функцию map_to_slice). В качестве альтернативы вы можете внутри шаблона передать карту пользовательской функции, которая возвращает канал и диапазон по нему, чтобы добиться более быстрого ощущения (например, play.golang.org/p/r9HWD2XC8h2).   -  person mkopriva    schedule 23.10.2018
comment
Спасибо @mkopriva. Это в значительной степени покрывает то, что я в итоге сделал. В более широком контексте я пытался решить эту проблему: github.com/jcmoraisjr/haproxy -вход/вопросы/240   -  person gjtempleton    schedule 25.10.2018