Как в Go реализуется рендеринг HTML-страниц (Views)? Какие подходы вы использовали?

Ответ

В Go нет концепции "View" как в классических MVC-фреймворках (вроде Rails или Django), но есть мощные инструменты для работы с шаблонами. Основной подход — использование стандартной библиотеки html/template.

Ключевое отличие html/template от text/templateавтоматическое экранирование данных для предотвращения XSS-атак. Это делает его безопасным для генерации HTML по умолчанию.

Основные подходы к рендерингу:

  1. Стандартная библиотека html/template: Идеально для серверного рендеринга (SSR). Позволяет вставлять данные в HTML-шаблоны, использовать условные операторы, циклы и вложенные шаблоны.

    // main.go
    import (
        "html/template"
        "net/http"
    )
    
    func handler(w http.ResponseWriter, r *http.Request) {
        // template.Must паникует при запуске, если файл шаблона не найден или содержит ошибки.
        // Это лучше, чем получать ошибку при каждом запросе.
        tmpl := template.Must(template.ParseFiles("view.html"))
        data := struct {
            Title   string
            Items   []string
        }{
            Title: "Моя страница",
            Items: []string{"Пункт 1", "Пункт 2", "Пункт 3"},
        }
        tmpl.Execute(w, data)
    }
  2. Веб-фреймворки (Gin, Echo, Chi): Они часто предоставляют удобные обертки над html/template для упрощения рендеринга в контексте их роутеров.

  3. API + Фронтенд-фреймворк (SPA): Самый современный подход. Go-бэкенд отдает данные в формате JSON, а рендерингом занимается фронтенд-приложение (React, Vue, Svelte), которое получает эти данные.