Получатели-значения
Часть раздела Логика и управление потоком путешествия по GO на Coddy. Урок 7 из 68.
Если определить метод с получателем-значением, метод будет работать с копией экземпляра структуры, а не с оригиналом. Это означает, что любые изменения получателя внутри метода не повлияют на исходную переменную структуры.
type Counter struct {
Value int
}
func (c Counter) increment() {
c.Value++ // Это изменяет копию, а не оригинал
}В этом примере метод increment имеет получатель-значение (c Counter). Когда вы вызываете этот метод для экземпляра Counter, Go создаёт копию структуры и передаёт её методу. Любые изменения c.Value внутри метода влияют только на эту копию.
Получатели-значения полезны, когда вашему методу нужно только читать данные из структуры, не изменяя их. Их безопасно использовать, поскольку они гарантируют, что исходные данные останутся неизменными, благодаря чему ваш код становится более предсказуемым и не возникают непреднамеренные побочные эффекты.
Задание
ЛегкоВ этом задании ты потренируешься работать с получателями-значениями, создав простую систему мониторинга температуры. Ты создашь структуру Sensor и определишь методы, демонстрирующие работу получателей-значений с копиями структуры.
Тебе будут переданы три входных значения:
- Строка, представляющая идентификатор датчика (например,
"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. Значения температуры следует выводить с точностью до одного знака после запятой.
Попробуйте сами
package main
import (
"fmt"
"strconv"
)
// TODO: Определите здесь структуру Sensor
// TODO: Определите здесь метод displayReading с получателем по значению
// TODO: Определите здесь метод adjustTemperature с получателем по значению
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Сравнение картПовторение — счётчик частоты слов8Проект: простой складской учёт
Обзор проектаПроверка запасов3Интерфейсы (основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование типов интерфейсовПустой интерфейсУтверждения типовПереключатель типовПовторение — формы и поведениеПотренируйтесь самостоятельно: Онлайн-компилятор Go