Получатели по значению
Часть раздела Логика и управление потоком путешествия по GO на Coddy — урок 7 из 68.
Когда вы определяете метод с value receiver, метод работает с копией экземпляра struct, а не с оригиналом. Это означает, что любые изменения, внесенные в получателя внутри метода, не повлияют на исходную переменную struct.
type Counter struct {
Value int
}
func (c Counter) increment() {
c.Value++ // Это изменяет копию, а не оригинал
}В этом примере метод increment имеет получатель значения (c Counter). Когда вы вызываете этот метод для экземпляра Counter, Go создает копию структуры и передает ее в метод. Любые изменения c.Value внутри метода влияют только на эту копию.
Приемники значений (value receivers) полезны, когда вашему методу нужно только считывать данные из структуры без их изменения. Они безопасны в использовании, так как гарантируют, что исходные данные останутся неизменными, что делает ваш код более предсказуемым и предотвращает появление непреднамеренных побочных эффектов.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Задание
ЛегкоВ этом испытании вы попрактикуетесь в работе с получателями значений (value receivers), создав простую систему мониторинга температуры. Вы создадите структуру Sensor и определите методы, которые демонстрируют, как получатели значений работают с копиями структуры.
Вы получите три входных значения:
- Строка, представляющая ID датчика (например,
"TEMP001") - Строка, представляющая текущее показание температуры (например,
"23.5") - Строка, представляющая значение корректировки температуры (например,
"2.0")
Ваша задача:
- Определить структуру
Sensorс двумя полями:ID(string) иTemperature(float64) - Создать метод с именем
displayReadingс получателем значения, который выводит информацию о датчике в формате:"Sensor [ID]: [temperature]°C" - Создать метод с именем
adjustTemperatureс получателем значения, который добавляет значение корректировки к температуре и выводит:"Adjusted reading: [new_temperature]°C" - Обработать входные данные для создания экземпляра
Sensor - Вызвать метод
displayReading, чтобы показать исходную температуру - Вызвать метод
adjustTemperatureсо значением корректировки - Снова вызвать метод
displayReading, чтобы продемонстрировать, что исходная структура осталась неизменной
Это испытание продемонстрирует, что методы с получателями значений работают с копиями структуры, поэтому значение температуры в исходной структуре останется неизменным даже после вызова метода adjustTemperature. Значения температуры должны отображаться с точностью до одного знака после запятой.
Шпаргалка
Приемники значений (Value receivers) работают с копией экземпляра структуры, а не с оригиналом. Изменения, внесенные внутри метода, не влияют на исходную структуру.
type Counter struct {
Value int
}
func (c Counter) increment() {
c.Value++ // Это изменяет копию, а не оригинал
}Приемники значений полезны, когда методам нужно только считывать данные без изменения исходной структуры, что делает код более предсказуемым и предотвращает непреднамеренные побочные эффекты.
Попробуйте сами
package main
import (
"fmt"
"strconv"
)
// TODO: Определите здесь вашу структуру Sensor
// TODO: Определите здесь ваш метод displayReading с получателем значения (value receiver)
// TODO: Определите здесь ваш метод adjustTemperature с получателем значения (value receiver)
func main() {
// Чтение входных данных
var sensorID string
var tempStr string
var adjustStr string
fmt.Scanln(&sensorID)
fmt.Scanln(&tempStr)
fmt.Scanln(&adjustStr)
// Парсинг значений температуры и корректировки
temperature, _ := strconv.ParseFloat(tempStr, 64)
adjustment, _ := strconv.ParseFloat(adjustStr, 64)
// TODO: Создайте экземпляр Sensor и вызовите необходимые методы
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком выполнения
Switch с использованием `fallthrough`Выход из вложенных цикловПродолжение конкретного циклаОператор `goto`Итоги: Продвинутое управление циклами4Проект: Простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели по значениюПолучатели по указателюВыбор типа получателяМетоды против функцийИтоги: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картИтоги: счетчик частоты слов3Интерфейсы (Основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование интерфейсных типовПустой интерфейсУтверждение типаПереключатель типовИтоги: Фигуры и поведение