Должен ли я вызывать template.ParseFiles (...) для каждого http-запроса или только один раз из основной функции? - PullRequest
0 голосов
/ 02 апреля 2019

Я занимаюсь веб-разработкой с использованием языка программирования go, используя пакет html/template. В какой-то момент кода мне нужно вызвать функцию template.ParseFiles(...), чтобы я мог создать шаблон из этих файлов и затем выполнить его, используя temp.Execute(w,data). Я хотел бы знать, лучше ли создавать шаблон для каждого запроса или делать это один раз в основном и объявить глобальную переменную.

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

Так выглядит каждый запрос

func ViewStats(w http.ResponseWriter, r *http.Request) {
    //Get stuff from db and put them in data
    //...
    //return data to user
    tmp, err := template.ParseFiles("views/guest-layout.html",
        "views/stats.html")

    if err != nil {
        fmt.Println(err)
    } else {
        tmp.Execute(w,data)
    }
}

Я хотел бы знать, лучше ли это:

var temp1 template.Template

func main() {
    temp1, err = template.ParseFiles("file1","file2") 
    //...
}

1 Ответ

1 голос
/ 02 апреля 2019

Как обычно: зависит.

Но сначала немного нюанса:

  1. Вы никогда не должны выполнять синтаксический анализ шаблона (или что-либо еще интересное) в вашей функции main(). Вместо этого ваша main() функция должна вызывать методы (или отдельный метод), которые запускают цепочку интересных вещей в вашей программе.

  2. В Go нет глобальных переменных, поэтому на самом деле это не вариант сохранения разбранных шаблонов в глобальной переменной. Ближайший Go имеет глобальные переменные это переменные пакета. Вы можете сохранить ваши проанализированные шаблоны в переменной пакета в пакете main, но это тоже плохая форма, поскольку ваш пакет main (за исключением крошечных, тривиальных программ) должен быть просто записью точка, а в остальном почти пусто.

Но теперь, к сути вашего вопроса:

Стоит ли разбирать шаблоны по запросу или за прогон?

А здесь все зависит.

Если у вас есть шаблоны, которые часто меняются (например, во время разработки, когда вы постоянно редактируете свои HTML-файлы), лучше всего один раз на запрос.

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

Но то, что может быть лучшим, на самом деле является чем-то вроде компромисса между двумя подходами. Лучше всего загружать ваши шаблоны при запуске и периодически перезагружать их, либо автоматически (скажем, каждые 5 минут), либо просматривать вашу файловую систему и перезагружать их всякий раз, когда изменяется представление шаблонов на диске.

Как это сделать, оставлено читателю в качестве упражнения.

...