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.
Desafio
FácilNeste 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 é:
- Definir uma struct
Sensorcom dois campos:ID(string) eTemperature(float64) - Criar um método chamado
displayReadingcom um receptor de valor que imprime as informações do sensor no formato:"Sensor [ID]: [temperature]°C" - Criar um método chamado
adjustTemperaturecom um receptor de valor que adiciona o valor de ajuste à temperatura e imprime:"Adjusted reading: [new_temperature]°C" - Analisar as entradas para criar uma instância de
Sensor - Chamar o método
displayReadingpara mostrar a temperatura original - Chamar o método
adjustTemperaturecom o valor de ajuste - Chamar o método
displayReadingnovamente 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
}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
1Fluxo de Controle Avançado
Switch com `fallthrough`Interrompendo Loops AninhadosContinuando um Loop EspecíficoA Instrução `goto`Recapitulação - Controle de Loop Avançado4Projeto: Lista de Tarefas Simples
Configuração do ProjetoAdicionando uma Tarefa2Structs e Métodos
Definindo Métodos em StructsRecebedores de ValorRecebedores de PonteiroEscolhendo RecebedoresMétodos vs FunçõesRecapitulação - Comportamento de Structs5Mapas em Profundidade
Mapas de StructsPonteiros como Valores de MapVerificando Mapas NilComparando MapasRecapitulação - Contador de Frequência de Palavras3Interfaces (O Básico)
O que é uma Interface?Definindo uma InterfaceImplementando uma InterfaceUsando Tipos de InterfaceInterface VaziaAsserções de TipoType SwitchRecapitulação - Formas e Comportamentos