Menu
Coddy logo textTech

Receptores de puntero vs. de valor

Parte de la sección Programación Orientada a Objetos del Journey de GO de Coddy — lección 8 de 107.

Los métodos pueden tener un receptor de valor o un receptor de puntero. Un receptor de valor trabaja sobre una copia de la estructura. Un receptor de puntero trabaja sobre la estructura original y puede modificar sus campos.

Receptor de valor — funciona sobre una copia

type Counter struct {
    Count int
}

func (c Counter) GetCount() int {
    return c.Count
}

// Esto NO modifica el original
func (c Counter) IncrementWrong() {
    c.Count++ // ¡Solo cambia la copia!
}

Receptor de puntero — modifica el original

// Esto SÍ modifica el original
func (c *Counter) Increment() {
    c.Count++
}

func (c *Counter) Reset() {
    c.Count = 0
}

Usando ambos juntos

func main() {
    counter := Counter{Count: 0}

    counter.Increment()
    counter.Increment()
    fmt.Println(counter.GetCount()) // Resultado: 2

    counter.Reset()
    fmt.Println(counter.GetCount()) // Resultado: 0
}

Usa un receptor de valor cuando el método solo lee datos. Usa un receptor de puntero (*StructName) cuando el método necesita modificar los campos de la estructura. Go maneja automáticamente la referenciación; ambos se llaman de la misma manera.

challenge icon

Desafío

Intermedio

Añade métodos a la estructura Wallet utilizando los tipos de receptor correctos:

  • GetBalance — receptor de valor, devuelve el saldo actual
  • Deposit — receptor de puntero, añade el monto al saldo
  • Withdraw — receptor de puntero, resta el monto solo si hay fondos suficientes

Hoja de referencia

Los métodos pueden tener un receptor de valor o un receptor de puntero. Un receptor de valor trabaja sobre una copia de la estructura. Un receptor de puntero trabaja sobre la estructura original y puede modificar sus campos.

Receptor de valor — trabaja sobre una copia:

type Counter struct {
    Count int
}

func (c Counter) GetCount() int {
    return c.Count
}

Receptor de puntero — modifica el original:

func (c *Counter) Increment() {
    c.Count++
}

Usa un receptor de valor cuando el método solo lee datos. Usa un receptor de puntero (*StructName) cuando el método necesite modificar los campos de la estructura.

Pruébalo tú mismo

package main

import "fmt"

func main() {
    var balance, deposit, withdraw float64
    fmt.Scan(&balance, &deposit, &withdraw)

    w := Wallet{Balance: balance}

    fmt.Printf("Balance: %.2f\n", w.GetBalance())

    w.Deposit(deposit)
    fmt.Printf("After deposit: %.2f\n", w.GetBalance())

    w.Withdraw(withdraw)
    fmt.Printf("After withdrawal: %.2f\n", w.GetBalance())

    fmt.Printf("Final balance: %.2f\n", w.GetBalance())
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos