Creando el Servidor

Clase 29 de 42Curso Práctico de Go: Creación de un Servidor Web

Contenido del curso

Construyendo un Servidor Web

Resumen

Construir un servidor web funcional es una de las mejores formas de consolidar los fundamentos de Go. Aquí se pone en práctica la organización de archivos por paquete, el uso de punteros y la librería estándar net/http para levantar un servidor capaz de escuchar conexiones en un puerto específico.

¿Cómo se estructura un proyecto de servidor web en Go?

La clave para mantener un código limpio es segmentar la lógica en archivos independientes dentro del mismo paquete. En este caso se crean dos archivos principales dentro de una carpeta llamada web server [0:24]:

  • main.go: punto de entrada del programa, contiene la función main.
  • server.go: define la estructura y el comportamiento del servidor.

Cuando ambos archivos pertenecen al mismo package main, se conocen entre sí automáticamente. Esto significa que cualquier struct, método o función definida en server.go puede ser utilizada directamente desde main.go sin necesidad de importaciones adicionales [1:25].

¿Qué es el struct server y por qué necesita un puerto?

En server.go se define un struct llamado server con un único campo: port, de tipo string [1:52]. Este campo indica en qué puerto el servidor estará escuchando peticiones entrantes. La estructura es intencionalmente simple para mantener el componente reutilizable en distintos proyectos.

go package main

type server struct { port string }

¿Cómo funciona la función new server con punteros?

La función newServer recibe el puerto como parámetro y retorna un puntero al struct server [2:04]. Aquí entran en juego dos operadores fundamentales de Go:

  • Asterisco (*): indica que se devuelve un puntero, no una copia del valor.
  • Ampersand (&): al momento del return, crea una referencia al valor real.

go func newServer(port string) *server { return &server{ port: port, } }

Gracias a esto, cualquier modificación posterior sobre el servidor se aplica al valor original y no a una copia, lo cual es esencial para mantener consistencia en el estado del programa [2:42].

¿Cómo se pone el servidor a escuchar conexiones?

El método listen es una receiver function asociada al struct server. Utiliza el paquete net/http de la librería estándar de Go, que cuenta con una implementación muy robusta para servidores web [3:25].

go func (s *server) listen() error { err := http.ListenAndServe(s.port, nil) if err != nil { return err } return nil }

Puntos importantes de este método:

  • http.ListenAndServe recibe dos parámetros: el puerto y un handler.
  • Se pasa nil como handler porque más adelante se crearán handlers personalizados para manejar rutas específicas [3:52].
  • Si ocurre un error al abrir la conexión, se retorna inmediatamente; si todo sale bien, se retorna nil.

¿Cómo se ejecuta el servidor desde main?

En main.go, la implementación es directa. Se crea una instancia del servidor con el puerto :3000 y se invoca el método listen [4:32]:

go package main

func main() { server := newServer(":3000") server.listen() }

Nota que el puerto se define como string con el formato ":3000", incluyendo los dos puntos antes del número.

¿Cómo se compilan múltiples archivos en Go?

Cuando un proyecto tiene más de un archivo, el comando go run necesita saber que debe leerlos todos. Para lograrlo se usa un asterisco como comodín [5:15]:

bash go run webserver/*.go

Este comando compila y ejecuta todos los archivos .go dentro del directorio. Al correrlo, si el programa no lanza ningún error, significa que la conexión está abierta y el servidor escucha activamente en el puerto indicado [5:30].

Sin embargo, en este punto el servidor aún no puede manejar rutas. Si un usuario intenta acceder al home o a cualquier endpoint de la API, no recibirá respuesta. La siguiente etapa consiste en agregar la funcionalidad de manejo de rutas mediante handlers personalizados.

¿Ya has experimentado con la creación de servidores en Go? Comparte tu experiencia o tus dudas sobre cómo implementar el manejo de rutas.