Получатели-указатели
Часть раздела Логика и управление потоком путешествия по GO на Coddy. Урок 8 из 68.
В то время как методы со значением-получателем работают с копиями структур, методы с получателем-указателем работают непосредственно с исходным экземпляром структуры. Если определить метод с получателем-указателем, он сможет изменять исходные данные, поскольку получает указатель на структуру, а не её копию.
Чтобы создать получателя-указатель, добавь звёздочку * перед именем типа в объявлении получателя:
type Person struct {
Name string
Age int
}
func (p *Person) haveBirthday() {
p.Age++ // Это изменяет исходную структуру
}В этом примере (p *Person) — получатель-указатель. Когда ты вызываешь метод haveBirthday для экземпляра Person, метод получает указатель на исходную структуру. Любые изменения полей структуры через этот указатель навсегда изменят исходные данные.
Получатели-указатели необходимы, когда вашим методам нужно обновлять поля структуры, поэтому они идеально подходят для операций, изменяющих состояние ваших данных.
Задание
ЛегкоВ этом задании ты потренируешься создавать методы с указателями-получателями, построив простую систему банковских счетов. Ты создашь структуру Account и определишь методы, которые могут изменять баланс счёта с помощью указателей-получателей.
Тебе будут предоставлены три входных значения:
- Строка, представляющая имя владельца счёта (например,
"John Smith") - Строка, представляющая начальный баланс счёта (например,
"1000.50") - Строка, представляющая сумму транзакции (например,
"250.75")
Твоя задача:
- Определить структуру
Accountс двумя полями:Name(строка) иBalance(float64) - Создать метод с именем
depositс указателем-получателем, который добавляет указанную сумму к балансу счёта - Создать метод с именем
withdrawс указателем-получателем, который вычитает указанную сумму из баланса счёта - Создать метод с именем
displayBalanceсо значимым получателем, который выводит информацию о счёте в формате:"Account: [name], Balance: $[balance]" - Разобрать входные данные, чтобы создать экземпляр
Account - Вызвать
displayBalance, чтобы показать начальный баланс - Вызвать
depositс суммой транзакции - Вызвать
displayBalance, чтобы показать баланс после внесения средств - Вызвать
withdrawс суммой транзакции - Вызвать
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: Выведите начальный баланс, выполните пополнение, выведите баланс, выполните снятие средств, выведите итоговый баланс
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком
Оператор switch с `fallthrough`Выход из вложенных цикловПереход к следующей итерации конкретного циклаОператор `goto`Повторение: расширенное управление циклами4Проект: простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели-значенияПолучатели-указателиВыбор получателейМетоды и функцииПовторение: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картПовторение — счётчик частоты слов8Проект: простой складской учёт
Обзор проектаПроверка запасов3Интерфейсы (основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование типов интерфейсовПустой интерфейсУтверждения типовПереключатель типовПовторение — формы и поведениеПотренируйтесь самостоятельно: Онлайн-компилятор Go