Kyrux
Voltar

Views e Context

Uma view é uma função func(ctx *router.Context).

func PostView(ctx *router.Context) {
    slug := ctx.Param("slug")           // parâmetro de path
    page := ctx.QueryInt("page", 1)     // query string com fallback

    post := models.GetBySlug(slug)
    if post == nil {
        ctx.Error(404)
        return
    }

    render.For("blog").Render(ctx, "post.html", map[string]any{
        "post": post,
        "page": page,
    })
}

⚠️ Nunca use ctx em goroutines que vivem além do handler — o Context volta a um pool quando o handler retorna e é reutilizado por outra requisição. Para trabalho assíncrono, faça uma cópia:

cp := ctx.Copy() // Params, dados e Request para leitura; Writer é nil
go func() { processar(cp.Param("id")) }()

Métodos do Context

Parâmetros de path

ctx.Param("slug")             // string — retorna "" se ausente
ctx.ParamInt("id")            // (int, bool) — (0, false) se inválido

Query string

ctx.Query("q")                // primeiro valor, "" se ausente
ctx.QueryDefault("order", "asc") // com fallback
ctx.QueryInt("page", 1)       // int com fallback
ctx.QueryAll("tag")           // []string — múltiplos valores do mesmo parâmetro

Respostas

// Renderizar HTML com template
render.For("meuapp").Render(ctx, "index.html", map[string]any{
    "titulo": "Olá mundo",
})

// JSON
ctx.JSON(200, map[string]any{"id": 1, "nome": "Kyrux"})

// HTML inline
ctx.HTML(200, "<h1>Olá</h1>")

// Redirect
ctx.Redirect("/login/", http.StatusFound)       // 302
ctx.Redirect("/home/", http.StatusMovedPermanently) // 301

// Página de erro
ctx.Error(404)
ctx.Error(403)
ctx.Error(500)

Dados internos do contexto (entre middlewares)

// Guardar
ctx.Set("usuario", usuario)

// Recuperar
v, ok := ctx.Get("usuario")
usuario := v.(*models.Usuario)

Acesso direto ao request e writer

ctx.Request           // *http.Request
ctx.Request.Method    // "GET", "POST", etc.
ctx.Request.Header    // http.Header
ctx.Writer            // http.ResponseWriter