Menu
Coddy logo textTech

Получатели-указатели и получатели-значения

Часть раздела Объектно-ориентированное программирование путешествия по GO на Coddy. Урок 8 из 107.

Методы могут иметь либо value receiver, либо pointer receiver. value receiver работает с копией struct. pointer receiver работает с original struct и может modify его поля.

Получатель receiver: работает с copy

type Counter struct {
    Count int
}

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

// Это НЕ изменяет оригинал
func (c Counter) IncrementWrong() {
    c.Count++ // Изменяет только копию!
}

Указатель receiver: изменяет original

// Это ДЕЙСТВИТЕЛЬНО изменяет оригинал
func (c *Counter) Increment() {
    c.Count++
}

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

Использование обоих вместе

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

    counter.Increment()
    counter.Increment()
    fmt.Println(counter.GetCount()) // Вывод: 2

    counter.Reset()
    fmt.Println(counter.GetCount()) // Вывод: 0
}

Используйте получатель-значение, когда метод только читает данные. Используйте получатель-указатель (*StructName), когда методу нужно изменить поля структуры. Go автоматически обрабатывает ссылку. Вызывайте оба одинаковым способом.

challenge icon

Задание

Средне

Добавьте методы к структуре Wallet, используя правильные типы receiver:

  • GetBalance: receiver-значение, возвращает текущий баланс
  • Deposit: receiver-указатель, добавляет amount к балансу
  • Withdraw: receiver-указатель, вычитает amount только при достаточном балансе

Попробуйте сами

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 iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Go