Определение методов для структур
Часть раздела Логика и управление потоком путешествия по GO на Coddy — урок 6 из 68.
В Go метод — это функция, которая принадлежит определенному типу. В отличие от обычных функций, которые существуют сами по себе, методы привязываются к структурам (structs) и позволяют определять поведение для ваших пользовательских типов данных.
Чтобы определить метод, вы помещаете получателя (receiver) между ключевым словом 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с получателем значения (value receiver), который выводит информацию о книге в формате:"Title: [title], Author: [author], Pages: [pages]" - Создать метод с именем
getDescriptionс получателем значения, который возвращает строку в формате:"[title] by [author]" - Использовать
bufio.Scannerдля правильного чтения строк ввода:- Создайте сканер:
scanner := bufio.NewScanner(os.Stdin) - Для каждой строки ввода: вызовите
scanner.Scan(), затемscanner.Text() - Это гарантирует, что названия и имена авторов с пробелами будут прочитаны правильно
- Создайте сканер:
- Обработать входные данные для создания экземпляра
Book - Вызвать метод
displayInfoдля вывода информации о книге - Вызвать метод
getDescriptionи вывести возвращенное описание
Методы должны использовать переменную-получатель для доступа к полям структуры и выполнения соответствующих операций. Помните, что методы с получателями значений работают с копией экземпляра структуры.
Шпаргалка
Методы в Go — это функции, которые относятся к определенному типу. Они определяются с получателем (receiver) между ключевым словом 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 представляет экземпляр, для которого вызывается метод.
Методы вызываются с использованием точечной нотации на экземплярах структур, что позволяет структурам выполнять действия, связанные с их данными.
Попробуйте сами
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, _ := strconv.Atoi(pagesStr)
// TODO: Создайте экземпляр Book и вызовите методы
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком выполнения
Switch с использованием `fallthrough`Выход из вложенных цикловПродолжение конкретного циклаОператор `goto`Итоги: Продвинутое управление циклами4Проект: Простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели по значениюПолучатели по указателюВыбор типа получателяМетоды против функцийИтоги: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картИтоги: счетчик частоты слов3Интерфейсы (Основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование интерфейсных типовПустой интерфейсУтверждение типаПереключатель типовИтоги: Фигуры и поведение