Menu
CoddyTech

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

Часть раздела Логика и управление потоком путешествия по GO на Coddy. Урок 8 из 68.

В то время как методы со значением-получателем работают с копиями структур, методы с получателем-указателем работают непосредственно с исходным экземпляром структуры. Если определить метод с получателем-указателем, он сможет изменять исходные данные, поскольку получает указатель на структуру, а не её копию.

Чтобы создать получателя-указатель, добавь звёздочку * перед именем типа в объявлении получателя:

type Person struct {
    Name string
    Age  int
}

func (p *Person) haveBirthday() {
    p.Age++  // Это изменяет исходную структуру
}

В этом примере (p *Person) — получатель-указатель. Когда ты вызываешь метод haveBirthday для экземпляра Person, метод получает указатель на исходную структуру. Любые изменения полей структуры через этот указатель навсегда изменят исходные данные.

Получатели-указатели необходимы, когда вашим методам нужно обновлять поля структуры, поэтому они идеально подходят для операций, изменяющих состояние ваших данных.

challenge icon

Задание

Легко

В этом задании ты потренируешься создавать методы с указателями-получателями, построив простую систему банковских счетов. Ты создашь структуру Account и определишь методы, которые могут изменять баланс счёта с помощью указателей-получателей.

Тебе будут предоставлены три входных значения:

  • Строка, представляющая имя владельца счёта (например, "John Smith")
  • Строка, представляющая начальный баланс счёта (например, "1000.50")
  • Строка, представляющая сумму транзакции (например, "250.75")

Твоя задача:

  1. Определить структуру Account с двумя полями: Name (строка) и Balance (float64)
  2. Создать метод с именем deposit с указателем-получателем, который добавляет указанную сумму к балансу счёта
  3. Создать метод с именем withdraw с указателем-получателем, который вычитает указанную сумму из баланса счёта
  4. Создать метод с именем displayBalance со значимым получателем, который выводит информацию о счёте в формате: "Account: [name], Balance: $[balance]"
  5. Разобрать входные данные, чтобы создать экземпляр Account
  6. Вызвать displayBalance, чтобы показать начальный баланс
  7. Вызвать deposit с суммой транзакции
  8. Вызвать displayBalance, чтобы показать баланс после внесения средств
  9. Вызвать withdraw с суммой транзакции
  10. Вызвать displayBalance, чтобы показать итоговый баланс

Баланс должен отображаться с точностью до двух знаков после запятой. Это задание показывает, как указатели-получатели позволяют методам изменять данные исходной структуры, в отличие от получателей-значений, которые работают с копиями.

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

package main

import (
	"fmt"
	"strconv"
)

// TODO: Определите здесь структуру Account

// TODO: Определите здесь метод deposit с получателем-указателем

// TODO: Определите здесь метод withdraw с получателем-указателем

// TODO: Определите здесь метод displayBalance с получателем-значением

func main() {
	// Считайте входные данные
	var name string
	var initialBalanceStr string
	var transactionAmountStr string
	
	fmt.Scanln(&name)
	fmt.Scanln(&initialBalanceStr)
	fmt.Scanln(&transactionAmountStr)
	
	// Преобразуйте входные строки в соответствующие типы
	initialBalance, _ := strconv.ParseFloat(initialBalanceStr, 64)
	transactionAmount, _ := strconv.ParseFloat(transactionAmountStr, 64)
	
	// TODO: Создайте экземпляр Account
	
	// TODO: Выведите начальный баланс, выполните пополнение, выведите баланс, выполните снятие средств, выведите итоговый баланс
}
quiz iconПроверьте себя

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

Все уроки раздела Логика и управление потоком

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