Estructuras de datos con enumeradores en Go

Clase 20 de 29Curso de Go

Resumen

Los enumeradores (enums) en Go ofrecen una manera sencilla y efectiva de restringir las opciones que pueden elegir tus usuarios. Crear un enumerador implica definir posibles estados o valores específicos para ciertas variables, lo que limita y asegura las entradas válidas dentro de tu aplicación.

¿Qué son los enumeradores y por qué utilizarlos?

Los enumeradores son estructuras de datos que permiten definir una serie limitada de opciones válidas para una variable determinada. Esto evita que los usuarios generen datos fuera del rango especificado, ayudando a reducir errores dentro de tu aplicación.

Entre sus ventajas, destacan:

  • Limitación efectiva de opciones que los usuarios pueden seleccionar.
  • Claridad y mantenimiento sencillo del código.
  • Reducción notable en márgenes de error al restringir entradas válidas.

¿Cómo se implementa un enumerador en Go?

A continuación, se detalla la creación práctica de un enumerador para manejar los estados de un servidor en el lenguaje Go.

Creación del enumerador

Primero, se define el enumerador utilizando la palabra clave type seguida de sus posibles valores:

type serverState int

const (
    StateIdle serverState = iota
    Connected
    Error
    Retry
)

Esto hace que StateIdle sea la opción por defecto si no se selecciona explícitamente otro estado.

Generar mensajes utilizando un mapa

Para asociar los estados del servidor con mensajes específicos, se emplea un mapa:

var serverStateMessages = map[serverState]string{
    StateIdle: "Idle",
    Connected: "Connected",
    Error:     "Error",
    Retry:     "Retrying",
}

Este método permite un manejo sencillo y rápido para obtener mensajes relacionados con cada estado.

Utilizar funciones para gestionar enumeradores

Puedes optimizar aun más la gestión de enumeradores usando funciones que se encarguen de devolver la cadena correspondiente del mapa:

func (state serverState) String() string {
    return serverStateMessages[state]
}

Esto simplifica y clarifica la recuperación de mensajes de acuerdo con el estado.

¿Cómo puedo manipular estados del servidor con enumeradores?

Usando un switch con enumeradores, es posible cambiar de estado fácilmente:

func verificarRed(servidor serverState) serverState {

    switch servidor {
    case StateIdle:
        return Connected
    case Connected, Retry:
        return StateIdle
    case Error:
        panic("Estado desconocido del servidor")
    }
    return StateIdle
}

Así, fácilmente puedes especificar qué ocurre según cada estado y gestionar errores de forma clara con la función panic.

¿Cómo ejecutar y verificar estados fácilmente?

Al implementar la función main, puedes realizar pruebas rápidas y determinantes sobre la operación del enumerador:

func main() {
    redServidor := verificarRed(StateIdle)
    fmt.Println("Estado del servidor:", redServidor)

    redServidor = verificarRed(Connected)
    fmt.Println("Segunda revisión, estado del servidor:", redServidor)
}

Con estas pruebas, confirmarás rápidamente los cambios esperados entre estados y verificarás fácilmente la funcionalidad correcta del enumerador.