Pular para o conteúdo

Go Fiber Tutorial: A Performance do Go com a Sintaxe do Express.js

O Fiber é um framework web para Go descrito pelo próprio projeto como “inspirado no Express” e construído sobre o fasthttp. A ideia é dar a quem vem do Node uma API familiar. Este tutorial usa a versão atual, a v3, e avisa onde ela difere de tutoriais mais antigos.

fasthttp e o custo da velocidade

A maioria dos frameworks Go, como o Gin, roda sobre o net/http da biblioteca padrão. O Fiber usa o fasthttp. O README do fasthttp afirma que o servidor é até 6 vezes mais rápido que o net/http e o cliente até 4 vezes, com números de microbenchmark (cerca de 1.422 ns/op contra 7.151 ns/op no servidor). Uma versão anterior deste post falava em “até 10x”, que não aparece nessa página.

O mesmo README é franco sobre o limite: para a maioria dos casos o net/http é melhor, por ser mais fácil e tratar mais situações. O fasthttp usa outro modelo de handler, não tem um ServeMux embutido e não deixa guardar referências ao contexto da requisição depois que o handler retorna. A documentação do Fiber diz que ele convive com a biblioteca padrão e oferece um adaptador para handlers de net/http.

Requisitos e instalação

O README do Fiber v3 pede Go 1.26 ou superior. A importação usa o caminho /v3:

mkdir aprendendo-fiber && cd aprendendo-fiber
go mod init meunome/fiber
go get github.com/gofiber/fiber/v3

Primeira API

package main

import (
    "log"

    "github.com/gofiber/fiber/v3"
)

func main() {
    app := fiber.New()

    app.Get("/", func(c fiber.Ctx) error {
        return c.SendString("Olá, mundo!")
    })

    app.Get("/ola/:nome", func(c fiber.Ctx) error {
        return c.SendString("Olá, " + c.Params("nome"))
    })

    log.Fatal(app.Listen(":3000"))
}

Rode com go run main.go e abra localhost:3000/ola/dev. Repare que o handler recebe fiber.Ctx como valor. Na v2 era *fiber.Ctx, o que quebra tutoriais antigos.

JSON

type Produto struct {
    Nome  string  `json:"nome"`
    Preco float64 `json:"preco"`
}

app.Post("/produtos", func(c fiber.Ctx) error {
    p := new(Produto)
    if err := c.Bind().JSON(p); err != nil {
        return c.Status(400).SendString(err.Error())
    }
    return c.Status(201).JSON(p)
})

Segundo a documentação, o método BodyParser da v2 foi substituído pela API Bind(). Há também c.Bind().Body(p), que detecta o tipo de conteúdo sozinho.

Gin ou Fiber?

O Gin roda sobre net/http e é compatível com todo o ecossistema de middleware padrão. O Fiber tem uma sintaxe mais próxima da do Express e usa fasthttp. Em benchmark sintético o Fiber costuma ganhar, mas banco de dados e rede costumam pesar mais que o framework no tempo total de uma requisição. Se o seu time vem do Node, o Fiber reduz a curva. Se quer o caminho mais conservador e compatível, o Gin é a escolha mais segura.

Exercício: adicione uma validação ao endpoint de produto e devolva 400 se o preço for menor que zero.