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.
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
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.
Folha de consulta
Recebedores de valor (Value receivers) operam em uma cópia da instância da struct, não na original. Alterações feitas dentro do método não afetam a struct original.
type Counter struct {
Value int
}
func (c Counter) increment() {
c.Value++ // Isso modifica a cópia, não a original
}Recebedores de valor são úteis quando os métodos precisam apenas ler dados sem modificar a struct original, tornando o código mais previsível e evitando efeitos colaterais indesejados.
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