Menu
Coddy logo textTech

Odbiorniki przez wartość

Część sekcji Logika i przepływ sterowania ścieżki GO w Coddy. Lekcja 7 z 68.

Gdy definiujesz metodę z odbiornikiem będącym wartością, metoda działa na kopii instancji struktury, a nie na oryginale. Oznacza to, że wszelkie zmiany wprowadzone w odbiorniku wewnątrz metody nie wpłyną na oryginalną zmienną struktury.

type Counter struct {
    Value int
}

func (c Counter) increment() {
    c.Value++  // To modyfikuje kopię, a nie oryginał
}

W tym przykładzie metoda increment ma odbiornik wartości (c Counter). Gdy wywołujesz tę metodę na instancji Counter, Go tworzy kopię struktury i przekazuje ją do metody. Wszelkie modyfikacje c.Value wewnątrz metody wpływają tylko na tę kopię.

Odbiorniki wartości są przydatne, gdy Twoja metoda musi jedynie odczytywać dane ze struktury, nie modyfikując jej. Można ich bezpiecznie używać, ponieważ gwarantują, że oryginalne dane pozostaną niezmienione, dzięki czemu Twój kod jest bardziej przewidywalny i nie dochodzi do niezamierzonych skutków ubocznych.

challenge icon

Wyzwanie

Łatwy

W tym wyzwaniu poćwiczysz pracę z odbiorcami przez wartość, tworząc prosty system monitorowania temperatury. Utworzysz strukturę Sensor i zdefiniujesz metody pokazujące, jak odbiorcy przez wartość działają na kopiach struktury.

Otrzymasz trzy dane wejściowe:

  • Łańcuch znaków reprezentujący identyfikator czujnika (np. "TEMP001")
  • Łańcuch znaków reprezentujący bieżący odczyt temperatury (np. "23.5")
  • Łańcuch znaków reprezentujący wartość korekty temperatury (np. "2.0")

Twoim zadaniem jest:

  1. Zdefiniować strukturę Sensor z dwoma polami: ID (string) i Temperature (float64)
  2. Utworzyć metodę o nazwie displayReading z odbiorcą przez wartość, która wyświetla informacje o czujniku w formacie: "Sensor [ID]: [temperature]°C"
  3. Utworzyć metodę o nazwie adjustTemperature z odbiorcą przez wartość, która dodaje wartość korekty do temperatury i wyświetla: "Adjusted reading: [new_temperature]°C"
  4. Przeanalizować dane wejściowe, aby utworzyć instancję Sensor
  5. Wywołać metodę displayReading, aby wyświetlić pierwotną temperaturę
  6. Wywołać metodę adjustTemperature z wartością korekty
  7. Ponownie wywołać metodę displayReading, aby pokazać, że pierwotna struktura pozostała niezmieniona

To wyzwanie pokaże, że metody z odbiorcami przez wartość działają na kopiach struktury, więc wartość temperatury w pierwotnej strukturze pozostanie niezmieniona nawet po wywołaniu metody adjustTemperature. Wartości temperatury należy wyświetlać z dokładnością do jednego miejsca po przecinku.

Spróbuj swoich sił

package main

import (
    "fmt"
    "strconv"
)

// TODO: Zdefiniuj tutaj strukturę Sensor

// TODO: Zdefiniuj tutaj metodę displayReading z odbiorcą przez wartość

// TODO: Zdefiniuj tutaj metodę adjustTemperature z odbiorcą przez wartość

func main() {
    // Odczytaj dane wejściowe
    var sensorID string
    var tempStr string
    var adjustStr string
    
    fmt.Scanln(&sensorID)
    fmt.Scanln(&tempStr)
    fmt.Scanln(&adjustStr)
    
    // Przekształć wartości temperatury i korekty
    temperature, _ := strconv.ParseFloat(tempStr, 64)
    adjustment, _ := strconv.ParseFloat(adjustStr, 64)
    
    // TODO: Utwórz instancję Sensor i wywołaj wymagane metody
    
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Logika i przepływ sterowania

Poćwicz samodzielnie: Kompilator Go online