Sobes.tech
Junior

O que significa a presença de uma estrela junto do receptor no Go?

sobes.tech IA

Resposta da IA

A presença de uma estrela (*) num receptor em Go indica que o método é chamado num ponteiro para uma instância do tipo, e não no valor do tipo.

As principais implicações são:

  1. Alteração de estado: Um método com receptor ponteiro pode modificar os campos da estrutura (ou outro tipo) para a qual aponta o ponteiro. Sem a estrela, o método trabalha com uma cópia do valor, e as alterações dentro do método não afetam o original.
  2. Desempenho: Passar um ponteiro pode ser mais eficiente do que passar uma estrutura grande por valor, pois apenas o endereço de memória é passado, não toda a estrutura.
  3. Valores nil: Os métodos com receptor ponteiro podem ser chamados em ponteiros nil, o que pode ser útil para lidar graciosamente com esses casos.

Exemplo:

package main

import "fmt"

type Counter struct {
	value int
}

// Método com receptor por valor: não modifica o Counter original
func (c Counter) IncrementByValue() {
	c.value++ // Apenas a cópia é modificada
}

// Método com receptor ponteiro: modifica o Counter original
func (c *Counter) IncrementByPointer() {
	c.value++ // O valor original é modificado
}

func main() {
	c1 := Counter{value: 0}
	c1.IncrementByValue()
	fmt.Println("Valor após IncrementByValue:", c1.value) // Vai imprimir 0

	c2 := Counter{value: 0}
	c2.IncrementByPointer()
	fmt.Println("Valor após IncrementByPointer:", c2.value) // Vai imprimir 1
}