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:
- 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.
- 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.
- Nil hodnoty: Metody s ukazatelem příjemcem mohou být volány na
nilukazatelí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
}