Menu
Coddy logo textTech

La función `init`

Parte de la sección Lógica y Flujo del Journey de GO de Coddy — lección 56 de 68.

La función init es una función especial en Go que se ejecuta automáticamente cuando se importa un paquete. A diferencia de las funciones regulares, no llamas a init directamente; Go la ejecuta por ti durante el proceso de inicialización del paquete.

Aquí tienes cómo definir una función init:

package mypackage

import "fmt"

func init() {
    fmt.Println("Package mypackage is being initialized!")
}

La función init tiene algunas características únicas: no recibe parámetros, no devuelve valores y se ejecuta antes de que comience la función main. Esto la hace perfecta para configurar el estado inicial, registrar componentes o realizar tareas de configuración única que su paquete necesite.

Cuando importas un paquete que contiene una función init, verás sus efectos inmediatamente, incluso si no utilizas ninguna de las funciones exportadas del paquete. Por esto es que el patrón de importación con identificador vacío que aprendiste anteriormente es tan útil: permite activar la inicialización de un paquete sin utilizar directamente su código.

quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

challenge icon

Desafío

Fácil

Crea un sistema de inicialización de paquetes que demuestre cómo las funciones init se ejecutan automáticamente cuando se importan los paquetes. Construirás un sistema de registro donde diferentes paquetes se inicializan a sí mismos y rastrean su secuencia de inicio.

Recibirás dos entradas:

  • Una cadena que contiene definiciones de paquetes en el formato "package1:message1,package2:message2,package3:message3" (por ejemplo, "database:Database connection pool initialized,cache:Cache system ready,logger:Logging system started")
  • Una cadena que contiene las operaciones del programa principal en el formato "operation1,operation2,operation3" (por ejemplo, "start_server,process_requests,shutdown")

Tu tarea es:

  1. Analizar la primera entrada dividiéndola por comas para obtener las definiciones de paquetes individuales
  2. Para cada definición de paquete, dividir por dos puntos para obtener el nombre del paquete y el mensaje de inicialización
  3. Crear un slice global llamado initLog para rastrear los mensajes de inicialización
  4. Crear una función llamada logInit que reciba un nombre de paquete y un mensaje, y luego añada el mensaje formateado "[INIT] [package_name]: [message]" al slice initLog
  5. Simular la inicialización de paquetes llamando a logInit para cada paquete en el orden en que aparecen en la entrada
  6. Mostrar el encabezado de la secuencia de inicialización: "=== PACKAGE INITIALIZATION SEQUENCE ==="
  7. Imprimir cada mensaje de inicialización del slice initLog
  8. Mostrar el encabezado del programa principal: "=== MAIN PROGRAM EXECUTION ==="
  9. Imprimir: "All packages initialized successfully"
  10. Analizar la segunda entrada dividiéndola por comas para obtener las operaciones individuales
  11. Para cada operación en el programa principal:
    • Imprimir: "Executing: [operation]"
    • Añadir un mensaje al registro: "[MAIN] Operation: [operation]"
  12. Mostrar el resumen de ejecución:
    • "=== EXECUTION SUMMARY ==="
    • "Packages initialized: [number_of_packages]"
    • "Main operations executed: [number_of_operations]"
    • "Total log entries: [total_number_of_log_entries]"
  13. Mostrar el registro completo:
    • "=== COMPLETE EXECUTION LOG ==="
    • Imprimir cada entrada del registro completo (tanto los mensajes de inicialización como las operaciones principales)
  14. Mostrar el mensaje final: "Program execution completed - all init functions ran before main"

Utiliza el paquete strings para dividir las cadenas de entrada y el paquete fmt para la salida formateada. Este desafío demuestra cómo las funciones init se ejecutan automáticamente durante la importación del paquete y siempre se ejecutan antes de la función main, lo que las hace perfectas para tareas de configuración e inicialización de paquetes.

Hoja de referencia

La función init es una función especial en Go que se ejecuta automáticamente cuando se importa un paquete:

package mypackage

import "fmt"

func init() {
    fmt.Println("Package mypackage is being initialized!")
}

Características clave de las funciones init:

  • No recibe parámetros y no devuelve valores
  • Se ejecuta automáticamente durante la inicialización del paquete
  • Se ejecuta antes de que comience la función main
  • Ideal para configurar el estado inicial y tareas de configuración de una sola vez
  • Se activa incluso con importaciones de identificadores en blanco

Pruébalo tú mismo

package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"
)

// Slice global para rastrear los mensajes de inicialización
var initLog []string

func main() {
	reader := bufio.NewReader(os.Stdin)

	// Leer entrada (bufio maneja correctamente las líneas con espacios)
	packageDefs, _ := reader.ReadString('\n')
	packageDefs = strings.TrimRight(packageDefs, "\r\n")

	mainOps, _ := reader.ReadString('\n')
	mainOps = strings.TrimRight(mainOps, "\r\n")

	// TODO: Escribe tu código a continuación
	// 1. Analizar packageDefs dividiendo por "," para obtener las entradas de paquetes individuales
	// 2. Para cada entrada, dividir por ":" (máximo 2 partes) para obtener packageName y message
	// 3. Crear una función logInit(packageName, message string) que añada
	//    "[INIT] [packageName]: message" al slice global initLog
	// 4. Mostrar el encabezado de la secuencia de inicialización y todas las entradas del registro de inicio
	// 5. Mostrar el encabezado de ejecución principal y procesar cada operación de mainOps
	//    - Imprimir "Executing: <op>" para cada operación
	//    - Añadir "[MAIN] Operation: <op>" a initLog
	// 6. Mostrar el resumen de ejecución (conteo de paquetes, conteo de operaciones, total de entradas del registro)
	// 7. Mostrar el registro completo y el mensaje final de finalización

}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Lógica y Flujo