Итерация отсортированной карты в шаблонах Go?

Я создаю веб-сайт на Go с помощью генератора статических сайтов Hugo. Я пытаюсь создать динамическую панель навигации для своих веб-страниц.

Вот что я делаю:

В моем файле config.yml я определил карту ссылок, которые я хотел бы отображать на своей панели навигации — вот как выглядит этот файл:

baseurl: "https://www.rdegges.com/"
languageCode: "en-us"
title: "Randall Degges"
params:
  navLinks: {"Twitter": "https://twitter.com/rdegges", "Facebook": "https://www.facebook.com/rdegges", "Google+": "https://plus.google.com/109157194342162880262", "Github": "https://github.com/rdegges"}

Итак, у меня также есть шаблон index.html в Hugo, который содержит панель навигации, которая выглядит так:

<nav>
  <ul>
    {{ range sort $title, $link := .Site.Params.navLinks }}
      <li><a href="{{ $link }}">{{ $title }}</a></li>
    {{ end }}
  </ul>
</nav>

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

Я знаю, что Карты не имеют изначальной структуры в Go, но есть ли способ каким-то образом сохранить первоначальный порядок элементов навигации?

Спасибо за помощь!


person rdegges    schedule 22.11.2015    source источник
comment
Используйте не карту, а срез. Мертвая простота.   -  person Volker    schedule 23.11.2015
comment
Не могли бы вы опубликовать пример того, как заставить его работать со срезом? Я новичок в шаблонах Go.   -  person rdegges    schedule 23.11.2015


Ответы (1)


Шаблоны Go сортируют карты по ключу. Если вы хотите форсировать определенный порядок, используйте срез:

Вот YAML:

baseurl: "https://www.rdegges.com/"
languageCode: "en-us"
title: "Randall Degges"
params:
    navLinks: 
        - title: Twitter
          url: https://twitter.com/rdegges
        - title: Facebook
          url: https://www.facebook.com/rdegges

... и шаблон:

<nav>
  <ul>
    {{ range $link := .Site.Params.navLinks }}
      <li><a href="{{ $link.url }}">{{ $link.title }}</a></li>
    {{ end }}
  </ul>
</nav>
person Cerise Limón    schedule 23.11.2015
comment
Спасибо! Это действительно полезно и спасло меня ‹3 Очень ценю помощь! - person rdegges; 23.11.2015
comment
Карты Go не имеют гарантированного порядка. - person bep; 15.01.2016
comment
@CodingPickle - нет, это неправда. Механизм шаблонов Go не делает ничего волшебного из коробки с заданными структурами данных, поэтому карта Go — это... карта Go. А начиная с версии Go 1.1 порядок клавиш при перемещении по карте Go не гарантируется. Это может показаться последовательным, но это не так. - person bep; 15.01.2016
comment
Мне кажется, что разработчики шаблонов добавили сортировку по умолчанию в действие {{range}} еще в 2012 году. rel="nofollow noreferrer">коммит github. Я читаю это неправильно? - person havoc1; 28.06.2017