Menu
Coddy logo textTech

Получатели по значению

Часть раздела Логика и управление потоком путешествия по 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) полезны, когда вашему методу нужно только считывать данные из структуры без их изменения. Они безопасны в использовании, так как гарантируют, что исходные данные останутся неизменными, что делает ваш код более предсказуемым и предотвращает появление непреднамеренных побочных эффектов.

quiz iconПроверьте себя

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

quiz iconПроверьте себя

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

quiz iconПроверьте себя

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

challenge icon

Задание

Легко

В этом испытании вы попрактикуетесь в работе с получателями значений (value receivers), создав простую систему мониторинга температуры. Вы создадите структуру Sensor и определите методы, которые демонстрируют, как получатели значений работают с копиями структуры.

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

  • Строка, представляющая ID датчика (например, "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. Значения температуры должны отображаться с точностью до одного знака после запятой.

Шпаргалка

Приемники значений (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 и вызовите необходимые методы
    
}
quiz iconПроверьте себя

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

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