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.
Wyzwanie
ŁatwyW 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:
- Zdefiniować strukturę
Sensorz dwoma polami:ID(string) iTemperature(float64) - Utworzyć metodę o nazwie
displayReadingz odbiorcą przez wartość, która wyświetla informacje o czujniku w formacie:"Sensor [ID]: [temperature]°C" - Utworzyć metodę o nazwie
adjustTemperaturez odbiorcą przez wartość, która dodaje wartość korekty do temperatury i wyświetla:"Adjusted reading: [new_temperature]°C" - Przeanalizować dane wejściowe, aby utworzyć instancję
Sensor - Wywołać metodę
displayReading, aby wyświetlić pierwotną temperaturę - Wywołać metodę
adjustTemperaturez wartością korekty - 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
}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
1Zaawansowane sterowanie przepływem
Instrukcja switch z `fallthrough`Przerywanie zagnieżdżonych pętliKontynuowanie określonej pętliInstrukcja `goto`Podsumowanie — zaawansowane sterowanie pętlami4Projekt: Prosta lista zadań
Konfiguracja projektuDodawanie zadania2Struktury i metody
Definiowanie metod dla strukturOdbiorniki przez wartośćOdbiorniki przez wskaźnikWybór odbiornikówMetody a funkcjePodsumowanie — działanie struktur5Mapy w szczegółach
Mapy strukturWskaźniki jako wartości mapSprawdzanie, czy mapy są nilPorównywanie mapPodsumowanie — licznik częstości słów3Interfejsy (podstawy)
Czym jest interfejs?Definiowanie interfejsuImplementowanie interfejsuUżywanie typów interfejsowychPusty interfejsAsercje typuPrzełącznik typówPodsumowanie – kształty i zachowaniaPoćwicz samodzielnie: Kompilator Go online