Sobes.tech
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:

  1. 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ł.
  2. 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.
  3. Wartości nil: Metody z wskaźnikiem na odbiorcy mogą być wywoływane na nil wskaź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
}