Menu
CoddyTech

Получатели-значения

Часть раздела Логика и управление потоком путешествия по GO на Coddy. Урок 7 из 68.

Если определить метод с получателем-значением, метод будет работать с копией экземпляра структуры, а не с оригиналом. Это означает, что любые изменения получателя внутри метода не повлияют на исходную переменную структуры.

type Counter struct {
    Value int
}

func (c Counter) increment() {
    c.Value++  // Это изменяет копию, а не оригинал
}

В этом примере метод increment имеет получатель-значение (c Counter). Когда вы вызываете этот метод для экземпляра Counter, Go создаёт копию структуры и передаёт её методу. Любые изменения c.Value внутри метода влияют только на эту копию.

Получатели-значения полезны, когда вашему методу нужно только читать данные из структуры, не изменяя их. Их безопасно использовать, поскольку они гарантируют, что исходные данные останутся неизменными, благодаря чему ваш код становится более предсказуемым и не возникают непреднамеренные побочные эффекты.

challenge icon

Задание

Легко

В этом задании ты потренируешься работать с получателями-значениями, создав простую систему мониторинга температуры. Ты создашь структуру Sensor и определишь методы, демонстрирующие работу получателей-значений с копиями структуры.

Тебе будут переданы три входных значения:

  • Строка, представляющая идентификатор датчика (например, "TEMP001")
  • Строка, представляющая текущее показание температуры (например, "23.5")
  • Строка, представляющая значение корректировки температуры (например, "2.0")

Твоя задача:

  1. Определить структуру Sensor с двумя полями: ID (string) и Temperature (float64)
  2. Создать метод с именем displayReading с получателем-значением, который выводит информацию о датчике в формате: "Sensor [ID]: [temperature]°C"
  3. Создать метод с именем adjustTemperature с получателем-значением, который прибавляет значение корректировки к температуре и выводит: "Adjusted reading: [new_temperature]°C"
  4. Обработать входные данные, чтобы создать экземпляр Sensor
  5. Вызвать метод displayReading, чтобы показать исходную температуру
  6. Вызвать метод adjustTemperature со значением корректировки
  7. Снова вызвать метод 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 и вызовите необходимые методы
    
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком

Потренируйтесь самостоятельно: Онлайн-компилятор Go