Receptores de valor
Parte de la sección Lógica y Flujo del Journey de GO de Coddy — lección 7 de 68.
Cuando defines un método con un receptor de valor, el método opera sobre una copia de la instancia de la struct en lugar de la original. Esto significa que cualquier cambio realizado en el receptor dentro del método no afectará a la variable struct original.
type Counter struct {
Value int
}
func (c Counter) increment() {
c.Value++ // Esto modifica la copia, no el original
}En este ejemplo, el método increment tiene un receptor de valor (c Counter). Cuando llamas a este método en una instancia de Counter, Go crea una copia del struct y la pasa al método. Cualquier modificación a c.Value dentro del método solo afecta a esta copia.
Los receptores de valor son útiles cuando su método solo necesita leer datos del struct sin modificarlo. Son seguros de usar porque garantizan que los datos originales permanezcan inalterados, lo que hace que su código sea más predecible y evita efectos secundarios no deseados.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Desafío
FácilEn este desafío, practicarás el trabajo con receptores de valor creando un sistema simple de monitoreo de temperatura. Crearás un struct Sensor y definirás métodos que demuestren cómo funcionan los receptores de valor con copias del struct.
Recibirás tres entradas:
- Una cadena que representa el ID del sensor (por ejemplo,
"TEMP001") - Una cadena que representa la lectura de temperatura actual (por ejemplo,
"23.5") - Una cadena que representa un valor de ajuste de temperatura (por ejemplo,
"2.0")
Tu tarea es:
- Definir un struct
Sensorcon dos campos:ID(string) yTemperature(float64) - Crear un método llamado
displayReadingcon un receptor de valor que imprima la información del sensor en el formato:"Sensor [ID]: [temperature]°C" - Crear un método llamado
adjustTemperaturecon un receptor de valor que sume el valor de ajuste a la temperatura e imprima:"Adjusted reading: [new_temperature]°C" - Analizar las entradas para crear una instancia de
Sensor - Llamar al método
displayReadingpara mostrar la temperatura original - Llamar al método
adjustTemperaturecon el valor de ajuste - Llamar al método
displayReadingnuevamente para demostrar que el struct original permanece sin cambios
Este desafío demostrará que los métodos con receptores de valor trabajan sobre copias del struct, por lo que el valor de temperatura del struct original permanecerá sin cambios incluso después de llamar al método adjustTemperature. Los valores de temperatura deben mostrarse con una precisión de un decimal.
Hoja de referencia
Los receptores de valor operan sobre una copia de la instancia de la estructura, no sobre la original. Los cambios realizados dentro del método no afectan a la estructura original.
type Counter struct {
Value int
}
func (c Counter) increment() {
c.Value++ // Esto modifica la copia, no la original
}Los receptores de valor son útiles cuando los métodos solo necesitan leer datos sin modificar la estructura original, lo que hace que el código sea más predecible y evita efectos secundarios no deseados.
Pruébalo tú mismo
package main
import (
"fmt"
"strconv"
)
// TODO: Define tu estructura Sensor aquí
// TODO: Define tu método displayReading con receptor de valor aquí
// TODO: Define tu método adjustTemperature con receptor de valor aquí
func main() {
// Leer entradas
var sensorID string
var tempStr string
var adjustStr string
fmt.Scanln(&sensorID)
fmt.Scanln(&tempStr)
fmt.Scanln(&adjustStr)
// Convertir los valores de temperatura y ajuste
temperature, _ := strconv.ParseFloat(tempStr, 64)
adjustment, _ := strconv.ParseFloat(adjustStr, 64)
// TODO: Crear una instancia de Sensor y llamar a los métodos requeridos
}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 comportamientos