Определение методов для структур
Часть раздела Логика и управление потоком путешествия по GO на Coddy. Урок 6 из 68.
В Go метод — это функция, принадлежащая определённому типу. В отличие от обычных функций, которые существуют сами по себе, методы привязаны к структурам и позволяют определять поведение для пользовательских типов данных.
Чтобы определить метод, поместите получатель между ключевым словом func и именем метода. Получатель указывает, к какому типу относится метод.
type Person struct {
Name string
Age int
}
func (p Person) greet() {
fmt.Printf("Hello, my name is %s\n", p.Name)
}В этом примере (p Person) — получатель, благодаря которому greet становится методом типа Person. Переменная p представляет экземпляр Person, для которого вызывается метод, как и this в других языках.
Затем ты можешь вызвать метод, используя точечную нотацию для любого экземпляра Person, наделив свои структуры возможностью выполнять действия, связанные с их данными.
Задание
ЛегкоВ этом задании ты попрактикуешься в определении методов для структур, создав простую систему управления книгами. Ты создашь структуру Book и определишь методы, которые позволят книге выводить информацию о себе.
Важное замечание: Поскольку названия книг и имена авторов могут содержать пробелы, для чтения строк ввода целиком нужно использовать bufio.Scanner. Функция fmt.Scanln прекращает чтение на первом пробеле, из-за чего названия и имена из нескольких слов будут прочитаны неправильно. Используй bufio.NewScanner(os.Stdin) и вызывай scanner.Scan(), а затем scanner.Text(), чтобы читать строки целиком.
Ты получишь три входных значения:
- Строку с названием книги (например,
"The Go Programming Language") - Строку с именем автора (например,
"Alan Donovan") - Строку с количеством страниц (например,
"380")
Твоя задача:
- Определить структуру
Bookс тремя полями:Title(string),Author(string) иPages(int) - Создать метод с именем
displayInfoи приемником-значением, который выводит информацию о книге в формате:"Title: [title], Author: [author], Pages: [pages]" - Создать метод с именем
getDescriptionи приемником-значением, который возвращает строку в формате:"[title] by [author]" - Использовать
bufio.Scanner, чтобы правильно читать строки ввода:- Создать сканер:
scanner := bufio.NewScanner(os.Stdin) - Для каждой строки ввода вызвать
scanner.Scan(), а затемscanner.Text() - Это гарантирует, что названия и имена авторов, содержащие пробелы, будут прочитаны правильно
- Создать сканер:
- Разобрать входные данные и создать экземпляр
Book - Вызвать метод
displayInfo, чтобы вывести информацию о книге - Вызвать метод
getDescriptionи вывести возвращённое описание
Методы должны использовать переменную-приёмник для доступа к полям структуры и выполнения соответствующих операций. Помни, что методы с приемниками-значениями работают с копией экземпляра структуры.
Попробуйте сами
package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
// TODO: Определите здесь структуру Book
// TODO: Определите здесь метод displayInfo
// TODO: Определите здесь метод getDescription
func main() {
// Создайте сканер для чтения строк ввода
scanner := bufio.NewScanner(os.Stdin)
// Считайте название
scanner.Scan()
title := scanner.Text()
// Считайте имя автора
scanner.Scan()
author := scanner.Text()
// Считайте количество страниц
scanner.Scan()
pagesStr := scanner.Text()
// Преобразуйте строку pages в целое число
pages, _ := strconv.Atoi(pagesStr)
// TODO: Создайте экземпляр Book и вызовите методы
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком
Оператор switch с `fallthrough`Выход из вложенных цикловПереход к следующей итерации конкретного циклаОператор `goto`Повторение: расширенное управление циклами4Проект: простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели-значенияПолучатели-указателиВыбор получателейМетоды и функцииПовторение: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картПовторение — счётчик частоты слов8Проект: простой складской учёт
Обзор проектаПроверка запасов3Интерфейсы (основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование типов интерфейсовПустой интерфейсУтверждения типовПереключатель типовПовторение — формы и поведениеПотренируйтесь самостоятельно: Онлайн-компилятор Go