Menu
Coddy logo textTech

Recebedores de Valor

Parte da seção Lógica & Fluxo do Journey de GO da Coddy — lição 7 de 68.

Quando você define um método com um receptor de valor (value receiver), o método opera em uma cópia da instância da struct em vez da original. Isso significa que quaisquer alterações feitas no receptor dentro do método não afetarão a variável original da struct.

type Counter struct {
    Value int
}

func (c Counter) increment() {
    c.Value++  // Isso modifica a cópia, não o original
}

Neste exemplo, o método increment possui um receptor de valor (value receiver) (c Counter). Quando você chama este método em uma instância de Counter, o Go cria uma cópia da struct e a passa para o método. Quaisquer modificações em c.Value dentro do método afetam apenas esta cópia.

Value receivers são úteis quando seu método precisa apenas ler dados da struct sem modificá-la. Eles são seguros de usar porque garantem que os dados originais permaneçam inalterados, tornando seu código mais previsível e evitando efeitos colaterais indesejados.

challenge icon

Desafio

Fácil

Neste desafio, você praticará o trabalho com receptores de valor (value receivers) criando um sistema simples de monitoramento de temperatura. Você criará uma struct Sensor e definirá métodos que demonstram como os receptores de valor funcionam com cópias da struct.

Você receberá três entradas:

  • Uma string representando o ID do sensor (ex: "TEMP001")
  • Uma string representando a leitura atual da temperatura (ex: "23.5")
  • Uma string representando um valor de ajuste de temperatura (ex: "2.0")

Sua tarefa é:

  1. Definir uma struct Sensor com dois campos: ID (string) e Temperature (float64)
  2. Criar um método chamado displayReading com um receptor de valor que imprime as informações do sensor no formato: "Sensor [ID]: [temperature]°C"
  3. Criar um método chamado adjustTemperature com um receptor de valor que adiciona o valor de ajuste à temperatura e imprime: "Adjusted reading: [new_temperature]°C"
  4. Analisar as entradas para criar uma instância de Sensor
  5. Chamar o método displayReading para mostrar a temperatura original
  6. Chamar o método adjustTemperature com o valor de ajuste
  7. Chamar o método displayReading novamente para demonstrar que a struct original permanece inalterada

Este desafio demonstrará que métodos com receptores de valor operam em cópias da struct, de modo que o valor da temperatura da struct original permanecerá inalterado mesmo após a chamada do método adjustTemperature. Os valores de temperatura devem ser exibidos com precisão de uma casa decimal.

Experimente você mesmo

package main

import (
    "fmt"
    "strconv"
)

// TODO: Defina sua struct Sensor aqui

// TODO: Defina seu método displayReading com value receiver aqui

// TODO: Defina seu método adjustTemperature com value receiver aqui

func main() {
    // Ler entradas
    var sensorID string
    var tempStr string
    var adjustStr string
    
    fmt.Scanln(&sensorID)
    fmt.Scanln(&tempStr)
    fmt.Scanln(&adjustStr)
    
    // Converter valores de temperatura e ajuste
    temperature, _ := strconv.ParseFloat(tempStr, 64)
    adjustment, _ := strconv.ParseFloat(adjustStr, 64)
    
    // TODO: Criar uma instância de Sensor e chamar os métodos necessários
    
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Lógica & Fluxo