Junior
Co oznacza obecność gwiazdki przy odbiorniku w Go?
sobes.tech AI
Odpowiedź od AI
Obecność gwiazdki (*) przy odbiorcy w Go oznacza, że metoda jest wywoływana na wskaźniku do instancji typu, a nie na samej wartości tego typu.
Główne konsekwencje tego to:
- Zmiana stanu: Metoda z wskaźnikiem na odbiorcy może modyfikować pola struktury (lub innego typu), na którą wskazuje wskaźnik. Bez gwiazdki, metoda działa na kopii wartości, a zmiany wewnątrz metody nie wpływają na oryginał.
- Wydajność: Przekazywanie wskaźnika może być bardziej efektywne niż przekazywanie dużej struktury przez wartość, ponieważ przekazywany jest tylko adres pamięci, a nie cała struktura.
- Wartości nil: Metody z wskaźnikiem na odbiorcy mogą być wywoływane na
nilwskaźnikach, co może być przydatne do eleganckiego obsługi takich przypadków.
Przykład:
package main
import "fmt"
type Counter struct {
value int
}
// Metoda na wartość: nie zmienia oryginalnego Counter
func (c Counter) IncrementByValue() {
c.value++ // zmienia się tylko kopia
}
// Metoda na wskaźnik: zmienia oryginalny Counter
func (c *Counter) IncrementByPointer() {
c.value++ // zmienia oryginalną wartość
}
func main() {
c1 := Counter{value: 0}
c1.IncrementByValue()
fmt.Println("Wartość po IncrementByValue:", c1.value) // Wypisze 0
c2 := Counter{value: 0}
c2.IncrementByPointer()
fmt.Println("Wartość po IncrementByPointer:", c2.value) // Wypisze 1
}