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:
- 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.
- 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.
- 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
}