Junior
Ce înseamnă prezența unei stele lângă receptor în Go?
sobes.tech AI
Răspuns de la AI
Prezența unui asterisc (*) în cazul unui receptor în Go indică faptul că metoda este apelată pe un pointer către o instanță a tipului, și nu pe valoarea propriu-zisă a tipului.
Principalele implicații sunt:
- Schimbarea stării: O metodă cu receptor de tip pointer poate modifica câmpurile structurii (sau altui tip) către care indică receptorul. Fără asterisc, metoda lucrează cu o copie a valorii, iar modificările din interiorul metodei nu afectează originalul.
- Performanță: Transmiterea unui pointer poate fi mai eficientă decât transmiterea unei structuri mari după valoare, deoarece se transmite doar adresa de memorie, nu întreaga structură.
- Valori nil: Metodele cu receptor de tip pointer pot fi apelate pe
nil-pointeri, ceea ce poate fi util pentru gestionarea elegantă a acestor cazuri.
Exemplu:
package main
import "fmt"
type Counter struct {
value int
}
// Metodă cu receptor pe valoare: nu modifică Counter-ul original
func (c Counter) IncrementByValue() {
c.value++ // Se modifică doar copia
}
// Metodă cu receptor pe pointer: modifică Counter-ul original
func (c *Counter) IncrementByPointer() {
c.value++ // Se modifică valoarea originală
}
func main() {
c1 := Counter{value: 0}
c1.IncrementByValue()
fmt.Println("Valoare după IncrementByValue:", c1.value) // Va afișa 0
c2 := Counter{value: 0}
c2.IncrementByPointer()
fmt.Println("Valoare după IncrementByPointer:", c2.value) // Va afișa 1
}