Sobes.tech
Junior

¿Qué significa la presencia de una estrella junto al receptor en Go?

sobes.tech AI

Respuesta de la IA

La presencia de una estrella (*) en un receptor en Go significa que el método se llama en un puntero a una instancia del tipo, y no en el valor del tipo.

Las principales implicaciones son:

  1. Cambio de estado: Un método con receptor puntero puede modificar los campos de la estructura (u otro tipo) a la que apunta el receptor. Sin la estrella, el método trabaja con una copia del valor, y los cambios dentro del método no afectan al original.
  2. Rendimiento: Pasar un puntero puede ser más eficiente que pasar una estructura grande por valor, ya que solo se pasa la dirección de memoria, no toda la estructura.
  3. Valores nil: Los métodos con receptor puntero pueden ser llamados en punteros nil, lo cual puede ser útil para manejar estos casos de manera elegante.

Ejemplo:

package main

import "fmt"

type Counter struct {
	value int
}

// Método con receptor por valor: no modifica el Counter original
func (c Counter) IncrementByValue() {
	c.value++ // Solo se modifica la copia
}

// Método con receptor puntero: modifica el Counter original
func (c *Counter) IncrementByPointer() {
	c.value++ // Se modifica el valor original
}

func main() {
	c1 := Counter{value: 0}
	c1.IncrementByValue()
	fmt.Println("Valor después de IncrementByValue:", c1.value) // Imprimirá 0

	c2 := Counter{value: 0}
	c2.IncrementByPointer()
	fmt.Println("Valor después de IncrementByPointer:", c2.value) // Imprimirá 1
}