Sobes.tech
Junior

Cosa significa la presenza di una stella accanto al ricevitore in Go?

sobes.tech AI

Risposta dell'AI

La presenza di un asterisco (*) in un ricevitore in Go indica che il metodo viene chiamato su un puntatore a un'istanza del tipo, e non sul valore del tipo.

Le principali implicazioni sono:

  1. Cambiamento di stato: Un metodo con ricevitore puntatore può modificare i campi della struttura (o altro tipo) a cui punta il ricevitore. Senza l'asterisco, il metodo lavora con una copia del valore, e le modifiche all'interno del metodo non influenzano l'originale.
  2. Prestazioni: Passare un puntatore può essere più efficiente che passare una grande struttura per valore, poiché si passa solo l'indirizzo di memoria, non l'intera struttura.
  3. Valori nil: I metodi con ricevitore puntatore possono essere chiamati su nil, il che può essere utile per gestire elegantemente tali casi.

Esempio:

package main

import "fmt"

type Counter struct {
	value int
}

// Metodo con ricevitore per valore: non modifica il Counter originale
func (c Counter) IncrementByValue() {
	c.value++ // Solo la copia viene modificata
}

// Metodo con ricevitore puntatore: modifica il Counter originale
func (c *Counter) IncrementByPointer() {
	c.value++ // Il valore originale viene modificato
}

func main() {
	c1 := Counter{value: 0}
	c1.IncrementByValue()
	fmt.Println("Valore dopo IncrementByValue:", c1.value) // Stampa 0

	c2 := Counter{value: 0}
	c2.IncrementByPointer()
	fmt.Println("Valore dopo IncrementByPointer:", c2.value) // Stampa 1
}