Introducción: ¿Por qué Go es ideal para REST API?
Go (Golang) es un lenguaje de programación compilado moderno, creado en Google. Combina el alto rendimiento de C++ con la simplicidad de Python. Si necesitas escribir rápidamente una REST API, Go es una de las mejores opciones. En este artículo crearemos una REST API completa en Go en 30 minutos, utilizando solo la biblioteca estándar net/http. Verás lo sencillo que es manejar solicitudes HTTP, enrutarlas y devolver respuestas JSON.
Al final del artículo, podrás escribir tu propia API que se pueda desplegar en un servidor. No usaremos frameworks de terceros — solo Go puro, lo que hace que el código sea ligero y rápido.
Paso 1: Instalación de Go y creación del proyecto
Instalación de Go
Si aún no tienes Go instalado, descarga la última versión desde el sitio oficial. Sigue las instrucciones para tu sistema operativo. Después de la instalación, verifica la versión en la terminal:
go versionDeberías ver algo como go version go1.22.0 linux/amd64.
Creación del proyecto
Crea un nuevo directorio para el proyecto e inicializa el módulo Go:
mkdir go-rest-apicd go-rest-apigo mod init go-rest-apiAhora la estructura del proyecto está lista. Escribiremos todo el código en un solo archivo main.go para no complicar el ejemplo.
Paso 2: Servidor HTTP simple en Go
Empecemos con un servidor HTTP básico. Abre el archivo main.go y agrega el siguiente código:
package main
import ( "fmt" "log" "net/http")
func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello, REST API on Go!") })
log.Println("Servidor iniciado en el puerto 8080") log.Fatal(http.ListenAndServe(":8080", nil))}Ejecuta el servidor con el comando go run main.go y abre el navegador en http://localhost:8080. Verás un mensaje de bienvenida. ¡Felicidades — tu primer servidor HTTP en Go está funcionando!
Análisis del código
http.HandleFunc— registra un manejador para la ruta "/".http.ListenAndServe— inicia el servidor en el puerto 8080.log.Fatal— muestra un error si el servidor no se inicia.
Paso 3: Agregamos enrutamiento y manejo de JSON
Ahora agregaremos soporte para el estilo REST: GET, POST, PUT, DELETE. Crearemos una simple "base de datos" en memoria (slice de estructuras) y gestionaremos una lista de tareas (todo list).
Estructura de datos
Agrega en main.go la descripción de la estructura Task y el slice global:
type Task struct { ID int `json:"id"` Name string `json:"name"`}
var tasks []Taskvar nextID int = 1Manejadores de rutas
Crearemos el manejador principal que analizará el método HTTP y llamará a la función correspondiente:
func tasksHandler(w http.ResponseWriter, r *http.Request) { switch r.Method { case http.MethodGet: getTasks(w, r) case http.MethodPost: createTask(w, r) default: http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) }}
func taskHandler(w http.ResponseWriter, r *http.Request) { // Extraemos el ID de la URL idStr := strings.TrimPrefix(r.URL.Path, "/tasks/") id, err := strconv.Atoi(idStr) if err != nil { http.Error(w, "Invalid task ID", http.StatusBadRequest) return }
switch r.Method { case http.MethodGet: getTask(w, r, id) case http.MethodPut: updateTask(w, r, id) case http.MethodDelete: deleteTask(w, r, id) default: http.Error(w, "Method not allowed", http.StatusMethodNot