Resumen: Entendiendo los punteros
Parte de la sección Fundamentos del Journey de GO de Coddy. Lección 66 de 109.
Desafío
IntermedioEn este desafío, construirás un sistema simple de gestión de inventario para una pequeña tienda. Utilizarás punteros para actualizar las cantidades del inventario, calcular valores y realizar un seguimiento de los cambios.
Completa las tres funciones a continuación:
-
updateQuantity(quantity *int, change int) (int, bool)
Modifica el valor enquantitysumandochange(negativo para ventas, positivo para reabastecimientos).
Si el resultado fuera inferior a0, establece*quantityen0en su lugar.
Devuelve la nueva cantidad y un booleano que seatruesi el artículo está ahora agotado (*quantity == 0). -
calculateValue(itemName string, quantity int, price float64, mostValuableItem *string, highestValue *float64) float64
CalculatotalValuecomofloat64(quantity) * price.
SitotalValuees mayor que*highestValue, actualiza*highestValuey establece*mostValuableItemcomoitemNameutilizando los punteros.
DevuelvetotalValue. -
displayInventory(apples, oranges, bananas *int, applePrice, orangePrice, bananaPrice float64)
Imprime el nombre de cada artículo, la cantidad (desreferenciada de su puntero) y el valor calculado utilizandofmt.Printf.
Formato:Apples: 10 (Value: $5.00)— utiliza%.2fpara los precios.
La salida esperada para el inventario inicial es:
Initial Inventory: Apples: 10 (Value: $5.00) Oranges: 15 (Value: $10.50) Bananas: 8 (Value: $2.40) Total inventory value: $17.90 Most valuable item: Oranges
Consejo: Utiliza *quantity para leer o escribir el valor al que apunta un puntero. Por ejemplo, *quantity += change modifica la variable original directamente.
Pruébalo tú mismo
package main
import "fmt"
// updateQuantity actualiza la cantidad de un artículo y devuelve la nueva cantidad
// y si el artículo está agotado (cantidad = 0)
func updateQuantity(quantity *int, change int) (int, bool) {
// TODO: Actualizar el puntero de cantidad y devolver el nuevo valor y el estado de agotado
return 0, false
}
// calculateValue calcula el valor total de un artículo basado en la cantidad y el precio
// También actualiza mostValuableItem si este artículo es más valioso
func calculateValue(itemName string, quantity int, price float64, mostValuableItem *string, highestValue *float64) float64 {
// TODO: Calcular el valor total, actualizar mostValuableItem si es necesario, y devolver el valor total
return 0.0
}
// displayInventory imprime los detalles del inventario
// Toma punteros para permitir que la función muestre datos en tiempo real
func displayInventory(apples, oranges, bananas *int, applePrice, orangePrice, bananaPrice float64) {
fmt.Printf("Apples: %d (Value: $%.2f)\n", *apples, float64(*apples) * applePrice)
fmt.Printf("Oranges: %d (Value: $%.2f)\n", *oranges, float64(*oranges) * orangePrice)
fmt.Printf("Bananas: %d (Value: $%.2f)\n", *bananas, float64(*bananas) * bananaPrice)
}
func main() {
// Inicializar inventario
apples := 10
oranges := 15
bananas := 8
// Precios
applePrice := 0.5 // $0.50 cada uno
orangePrice := 0.7 // $0.70 cada uno
bananaPrice := 0.3 // $0.30 cada uno
// Rastrear el artículo más valioso
var mostValuableItem string
var highestValue float64
// Mostrar inventario inicial
fmt.Println("Initial Inventory:")
displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
// Calcular valores iniciales y encontrar el artículo más valioso
appleValue := calculateValue("Apples", apples, applePrice, &mostValuableItem, &highestValue)
orangeValue := calculateValue("Oranges", oranges, orangePrice, &mostValuableItem, &highestValue)
bananaValue := calculateValue("Bananas", bananas, bananaPrice, &mostValuableItem, &highestValue)
fmt.Printf("Total inventory value: $%.2f\n", appleValue+orangeValue+bananaValue)
fmt.Printf("Most valuable item: %s\n\n", mostValuableItem)
// Simular algunas ventas
fmt.Println("Processing sales...")
_, applesOutOfStock := updateQuantity(&apples, -4) // Vender 4 manzanas
_, orangesOutOfStock := updateQuantity(&oranges, -8) // Vender 8 naranjas
_, bananasOutOfStock := updateQuantity(&bananas, -10) // Intentar vender 10 bananas (más de las que tenemos)
// Comprobar si algún artículo está agotado
if applesOutOfStock {
fmt.Println("Apples are out of stock!")
}
if orangesOutOfStock {
fmt.Println("Oranges are out of stock!")
}
if bananasOutOfStock {
fmt.Println("Bananas are out of stock!")
}
// Mostrar inventario actualizado
fmt.Println("\nUpdated Inventory:")
displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
// Reiniciar el rastreo del más valioso para el recálculo
mostValuableItem = ""
highestValue = 0
// Recalcular valores
appleValue = calculateValue("Apples", apples, applePrice, &mostValuableItem, &highestValue)
orangeValue = calculateValue("Oranges", oranges, orangePrice, &mostValuableItem, &highestValue)
bananaValue = calculateValue("Bananas", bananas, bananaPrice, &mostValuableItem, &highestValue)
fmt.Printf("Total inventory value: $%.2f\n", appleValue+orangeValue+bananaValue)
fmt.Printf("Most valuable item: %s\n\n", mostValuableItem)
// Reponer artículos
fmt.Println("Restocking...")
updateQuantity(&apples, 5) // Añadir 5 manzanas
updateQuantity(&oranges, 10) // Añadir 10 naranjas
updateQuantity(&bananas, 12) // Añadir 12 bananas
// Mostrar inventario final
fmt.Println("\nFinal Inventory:")
displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
// Reiniciar el rastreo del más valioso para el cálculo final
mostValuableItem = ""
highestValue = 0
// Cálculo del valor final
appleValue = calculateValue("Apples", apples, applePrice, &mostValuableItem, &highestValue)
orangeValue = calculateValue("Oranges", oranges, orangePrice, &mostValuableItem, &highestValue)
bananaValue = calculateValue("Bananas", bananas, bananaPrice, &mostValuableItem, &highestValue)
fmt.Printf("Total inventory value: $%.2f\n", appleValue+orangeValue+bananaValue)
fmt.Printf("Most valuable item: %s\n", mostValuableItem)
}Todas las lecciones de Fundamentos
4Operadores de comparación y lógicos
Operadores de comparación - Parte 1Operadores de comparación - Parte 2Operador lógico ANDOperador lógico OROperador lógico NOTConceptos básicos de precedencia de operadoresResumen: Realizar comparaciones7Flujo de control: Bucles
Explicación del bucle `for`Bucle `for` - BásicoBucle `for` - Solo condiciónLa palabra clave `break`La palabra clave `continue`Bucles anidadosResumen - Repetición de acciones2Variables y tipos de datos básicos
¿Qué es una variable?Inferencia de tipos con `:=`Enteros (int)Números de punto flotanteBooleanosStringsValores ceroConstantesConvenciones de nomenclaturaResumen - Variables y tipos5Entrada y salida básica
Salida con formatoVerbos de formatoImpresión de tiposObtener entrada básica del usuarioResumen: Entrada y salida8Funciones
Comprendiendo las funcionesDeclaración de una funciónLlamada a funcionesParámetros de funciónRetorno de un solo valorRetorno de múltiples valoresValores de retorno con nombreConceptos básicos del alcance de las funcionesResumen: Creando código reutilizable3Operadores básicos
Operadores aritméticosOperador de divisiónEl operador móduloOperador de asignaciónOperadores de asignación compuestaIncremento y decrementoResumen - Cálculos6Flujo de control: Condicionales
La sentencia `if`La palabra clave `else`La palabra clave `else if`Sombreado de variables en `if`Inicialización de variablesLa sentencia `switch``switch` con expresiones`switch` sin expresiónLa palabra clave `fallthrough`Resumen: Toma de decisiones9Punteros
¿Qué es un puntero?Declaración de variables de punteroEl operador de dirección (Address-Of)Desreferenciación de punterosUso de punteros en funcionesPunteros NilResumen: Entendiendo los punterosPractica por tu cuenta: Compilador de Go online