Crear un paquete simple
Parte de la sección Lógica y Flujo del Journey de GO de Coddy. Lección 53 de 68.
¡Ahora es el momento de crear tu propio paquete personalizado! Crear paquetes te permite organizar tu código en módulos reutilizables que se pueden importar y usar en diferentes programas.
Para crear un paquete, comienzas declarándolo en la parte superior de tu archivo con la palabra clave package, seguida del nombre del paquete. Para nuestro paquete de calculadora, usaremos:
package calculatorDentro de este paquete, puedes definir funciones, variables y tipos. Recuerda que solo los identificadores exportados (los que comienzan con una letra mayúscula) estarán disponibles desde otros paquetes. Así es como podrías definir una función Add exportada:
package calculator
func Add(a, b int) int {
return a + b
}Para usar tu paquete personalizado desde otro archivo, lo importas igual que cualquier otro paquete. Desde tu paquete main, después puedes llamar a las funciones exportadas:
package main
import "calculator"
func main() {
result := calculator.Add(5, 3)
}Este enfoque modular hace que tu código esté más organizado y te permite reutilizar la funcionalidad en varios programas sin duplicar código.
Desafío
FácilCrea un paquete personalizado mathutils con operaciones matemáticas básicas y después úsalo desde tu programa principal. Este desafío pondrá a prueba tu capacidad para crear un paquete, definir funciones exportadas e importar tu paquete personalizado para usarlo en otro programa.
Recibirás dos entradas:
- Una cadena que contiene definiciones de funciones con el formato
"function1:param1,param2:operation|function2:param1,param2:operation"(por ejemplo,"Add:5,3:addition|Multiply:4,7:multiplication|Subtract:10,4:subtraction") - Una cadena que contiene solicitudes de cálculo con el formato
"operation1:value1,value2|operation2:value1,value2|operation3:value1,value2"(por ejemplo,"Add:15,25|Multiply:6,8|Subtract:50,20")
Tu tarea es:
- Crea un paquete
mathutilsdeclarandopackage mathutilsen la parte superior - Analiza la primera entrada dividiéndola por tuberías (
|) para obtener las definiciones de funciones individuales - Para cada definición de función, divídela por dos puntos para obtener el nombre de la función, los parámetros y el tipo de operación
- Crea las siguientes funciones exportadas en tu paquete
mathutils:Add(a, b int) int: devuelve la suma de a y bSubtract(a, b int) int: devuelve a menos bMultiply(a, b int) int: devuelve el producto de a y bDivide(a, b int) int: devuelve a dividido por b (división entera)
- En tu programa principal, importa el paquete
mathutils - Muestra el encabezado de información del paquete:
"=== MATHUTILS PACKAGE DEMO ===" - Analiza la primera entrada y muestra las funciones disponibles:
"Available functions in mathutils package:"- Para cada función:
"- [function_name]: Performs [operation_type] on two integers"
- Analiza la segunda entrada dividiéndola por tuberías para obtener las solicitudes de cálculo individuales
- Para cada solicitud de cálculo, divídela por dos puntos para obtener el nombre de la función y los parámetros
- Divide los parámetros por comas para obtener los dos valores enteros
- Convierte las cadenas de parámetros en enteros usando
strconv.Atoi - Muestra el encabezado del proceso de cálculo:
"Performing calculations:" - Para cada solicitud de cálculo:
- Llama a la función correspondiente del paquete
mathutils - Muestra:
"mathutils.[function_name]([param1], [param2]) = [result]"
- Llama a la función correspondiente del paquete
- Calcula y muestra las estadísticas resumidas:
"Calculation Summary:""Total calculations performed: [number_of_calculations]""Functions used: [comma_separated_list_of_unique_function_names_used]""Sum of all results: [sum_of_all_calculation_results]"
- Muestra la confirmación del uso del paquete:
"Package demonstration completed successfully""All functions from mathutils package executed correctly"
Usa el paquete strings para dividir las cadenas de entrada, el paquete strconv para convertir cadenas en enteros y el paquete fmt para la salida con formato. Recuerda que solo se exportarán y serán accesibles desde otros paquetes las funciones que comienzan con letras mayúsculas.
Importante: Ambas líneas de entrada usan tuberías (|) como delimitador entre las entradas. Cada entrada de la primera línea tiene el formato FunctionName:param1,param2:operationtype: divide primero por | y después divide cada entrada por : para extraer el nombre de la función (índice 0) y el tipo de operación (índice 2).
Este desafío demuestra cómo crear código reutilizable mediante paquetes personalizados y cómo organizar la funcionalidad en módulos lógicos.
Pruébalo tú mismo
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
// TODO: Create your mathutils package functions here
// Como no podemos usar archivos separados, define las funciones directamente
// Estas normalmente estarían en un archivo de paquete separado
func main() {
// Lee la entrada usando bufio.Scanner para manejar los espacios correctamente
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
functionDefs := scanner.Text()
scanner.Scan()
calcRequests := scanner.Text()
// TODO: Escribe tu código debajo
// 1. Define Add, Subtract, Multiply, Divide functions (simulating mathutils package)
// 2. Analiza functionDefs: divide por '|' para obtener cada definición, luego divide cada una por ':'
// Formato: FuncName:param1,param2:operation (p. ej. "Add:5,3:addition")
// 3. Display package information and available functions
// 4. Parse calcRequests (split by '|'), perform calculations
// 5. Muestra los resultados y las estadísticas de resumen
// Suprime las advertencias de variables no usadas
_ = functionDefs
_ = calcRequests
_ = fmt.Sprintf
_ = strconv.Atoi
_ = strings.Split
// Recuerda generar el formato requerido según se especifica en el desafío
}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
1Flujo de control avanzado
Switch con `fallthrough`Salir de bucles anidadosContinuar un bucle específicoLa sentencia `goto`Repaso: Control de bucles avanzado4Proyecto: Lista de tareas sencilla
Configuración del proyectoAñadir una tarea2Estructuras y Métodos
Definición de métodos en estructurasReceptores de valorReceptores de punteroElegir receptoresMétodos vs FuncionesResumen - Comportamiento de estructuras5Mapas en profundidad
Mapas de StructsPunteros como valores de MapVerificación de Maps NilComparación de MapsResumen - Contador de frecuencia de palabras3Interfaces (Conceptos básicos)
¿Qué es una interfaz?Definir una interfazImplementar una interfazUso de tipos de interfazInterfaz vacíaAserciones de tipoType SwitchResumen: Formas y comportamientos6Go idiomático: Sets
El modismo de Set en GoCrear un SetAñadir a un SetComprobar pertenenciaEliminar de un SetIterar sobre un SetResumen: Nombres de usuario únicos9Paquetes y Ámbito
¿Qué es un paquete?Exportado vs. No exportadoCrear un paquete simpleAlias de paquetesEl identificador en blanco `_`La función `init`Repaso - Construir una utilidadPractica por tu cuenta: Compilador de Go online