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

  1. 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.
  2. 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ă.
  3. 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
}