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 por valor, o método opera em uma cópia da instância da struct, em vez de operar na 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 tem um receptor por valor (c Counter). Quando você chama esse 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 essa cópia.

Receptores por valor 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 uso de receptores por valor criando um sistema simples de monitoramento de temperatura. Você criará uma estrutura Sensor e definirá métodos que demonstram como os receptores por valor funcionam com cópias da estrutura.

Você receberá três entradas:

  • Uma string que representa o ID do sensor (por exemplo, "TEMP001")
  • Uma string que representa a leitura atual da temperatura (por exemplo, "23.5")
  • Uma string que representa um valor de ajuste de temperatura (por exemplo, "2.0")

Sua tarefa é:

  1. Definir uma estrutura Sensor com dois campos: ID (string) e Temperature (float64)
  2. Criar um método chamado displayReading com um receptor por valor que exiba as informações do sensor no formato: "Sensor [ID]: [temperature]°C"
  3. Criar um método chamado adjustTemperature com um receptor por valor que adicione o valor de ajuste à temperatura e exiba: "Adjusted reading: [new_temperature]°C"
  4. Analisar as entradas para criar uma instância de Sensor
  5. Chamar o método displayReading para exibir 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 estrutura original permanece inalterada

Este desafio demonstrará que os métodos com receptores por valor operam em cópias da estrutura; portanto, o valor da temperatura da estrutura 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

Pratique por conta própria: Compilador de Go online