Sobes.tech
Junior

Čo znamená prítomnosť hviezdičky pri prijímači v Go?

sobes.tech AI

Odpoveď od AI

Prítomnosť hviezdičky (*) u príjemcu v Go znamená, že metóda je volaná na ukazovateli na inštanciu typu, a nie na samotnej hodnote typu.

Hlavné dôsledky sú:

  1. Zmena stavu: Metóda s ukazovateľom príjemcom môže meniť polia štruktúry (alebo iného typu), na ktorú ukazuje ukazovateľ. Bez hviezdičky, metóda pracuje s kópiou hodnoty, a zmeny vnútri metódy sa neprejavia na origináli.
  2. Výkon: Odovzdanie ukazovateľa môže byť efektívnejšie ako odovzdanie veľkej štruktúry hodnotou, pretože sa odovzdáva iba adresa pamäte, nie celá štruktúra.
  3. Nil hodnoty: Metódy s ukazovateľom príjemcom môžu byť volané na nil ukazovateľoch, čo môže byť užitočné pre elegantné spracovanie takýchto prípadov.

Príklad:

package main

import "fmt"

type Counter struct {
	value int
}

// Metóda s hodnotovým príjemcom: nemení pôvodný Counter
func (c Counter) IncrementByValue() {
	c.value++ // Mění se pouze kopie
}

// Metóda s ukazovateľom: mení pôvodný Counter
func (c *Counter) IncrementByPointer() {
	c.value++ // Pôvodná hodnota sa mení
}

func main() {
	c1 := Counter{value: 0}
	c1.IncrementByValue()
	fmt.Println("Hodnota po IncrementByValue:", c1.value) // Vypíše 0

	c2 := Counter{value: 0}
	c2.IncrementByPointer()
	fmt.Println("Hodnota po IncrementByPointer:", c2.value) // Vypíše 1
}