Sobes.tech
Junior

Co znamená přítomnost hvězdičky u přijímače v Go?

sobes.tech AI

Odpověď od AI

Přítomnost hvězdičky (*) u příjemce v Go znamená, že metoda je volána na ukazateli na instanci typu, nikoliv na samotné hodnotě typu.

Hlavní důsledky jsou:

  1. Změna stavu: Metoda s ukazatelem příjemcem může měnit pole struktury (nebo jiného typu), na kterou ukazatel ukazuje. Bez hvězdičky metoda pracuje s kopií hodnoty, a změny uvnitř metody se neprojeví na originálu.
  2. Výkon: Předání ukazatele může být efektivnější než předání velké struktury hodnotou, protože se předává pouze adresa paměti, nikoliv celá struktura.
  3. Nil hodnoty: Metody s ukazatelem příjemcem mohou být volány na nil ukazatelích, což může být užitečné pro elegantní zpracování takových případů.

Příklad:

package main

import "fmt"

type Counter struct {
	value int
}

// Metoda s hodnotovým příjemcem: nemění původní Counter
func (c Counter) IncrementByValue() {
	c.value++ // Mění se pouze kopie
}

// Metoda s ukazatelem: mění původní Counter
func (c *Counter) IncrementByPointer() {
	c.value++ // Mění se původní hodnota
}

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
}