Golang: как обойти ограничения доступа к данным при работе с шаблонизатором в цикле

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

Ограничения доступа

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

data := []string{"apple", "banana", "cherry"}

for _, item := range data {
    fmt.Println(item)
}

Однако, если мы хотим использовать item совместе с шаблонизатором, мы получим ошибку:

tpl.Execute(os.Stdout, map[string]string{"item": item})

Ошибка:

undefined: item

Решение

Есть несколько способов решения этой проблемы:

Сохранение в слайсе

Первый способ - сохранить переменную в слайсе перед использованием с шаблонизатором:

data := []string{"apple", "banana", "cherry"}

var items []string
for _, item := range data {
    items = append(items, item)
}

tpl.Execute(os.Stdout, map[string][]string{"items": items})

Сохранение в структуре

Второй способ - сохранить переменную в структуре:

type item struct {
    Name string
}

data := []string{"apple", "banana", "cherry"}

var items []item
for _, name := range names {
    items = append(items, item{Name: name})
}

tpl.Execute(os.Stdout, map[string][]item{"items": items})

Обертывание в функцию

Третий способ - обернуть код в функцию и использовать range внутри нее:

func itemRange(data []string, cb func(item string)) {
    for _, item := range data {
        cb(item)
    }
}

data := []string{"apple", "banana", "cherry"}

var items []item
itemRange(data, func(name string) {
    items = append(items, item{Name: name})
})

tpl.Execute(os.Stdout, map[string][]item{"items": items})

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

Смотри также: