Menu
Coddy logo textTech

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.

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

En 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:

  1. Definir un struct Sensor con dos campos: ID (string) y Temperature (float64)
  2. Crear un método llamado displayReading con un receptor de valor que imprima la información del sensor en el formato: "Sensor [ID]: [temperature]°C"
  3. Crear un método llamado adjustTemperature con un receptor de valor que sume el valor de ajuste a la temperatura e imprima: "Adjusted reading: [new_temperature]°C"
  4. Analizar las entradas para crear una instancia de Sensor
  5. Llamar al método displayReading para mostrar la temperatura original
  6. Llamar al método adjustTemperature con el valor de ajuste
  7. Llamar al método displayReading nuevamente 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
    
}
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