Menu
CoddyTech

Определение методов для структур

Часть раздела Логика и управление потоком путешествия по 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, наделив свои структуры возможностью выполнять действия, связанные с их данными.

challenge icon

Задание

Легко

В этом задании ты попрактикуешься в определении методов для структур, создав простую систему управления книгами. Ты создашь структуру Book и определишь методы, которые позволят книге выводить информацию о себе.

Важное замечание: Поскольку названия книг и имена авторов могут содержать пробелы, для чтения строк ввода целиком нужно использовать bufio.Scanner. Функция fmt.Scanln прекращает чтение на первом пробеле, из-за чего названия и имена из нескольких слов будут прочитаны неправильно. Используй bufio.NewScanner(os.Stdin) и вызывай scanner.Scan(), а затем scanner.Text(), чтобы читать строки целиком.

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

  • Строку с названием книги (например, "The Go Programming Language")
  • Строку с именем автора (например, "Alan Donovan")
  • Строку с количеством страниц (например, "380")

Твоя задача:

  1. Определить структуру Book с тремя полями: Title (string), Author (string) и Pages (int)
  2. Создать метод с именем displayInfo и приемником-значением, который выводит информацию о книге в формате: "Title: [title], Author: [author], Pages: [pages]"
  3. Создать метод с именем getDescription и приемником-значением, который возвращает строку в формате: "[title] by [author]"
  4. Использовать bufio.Scanner, чтобы правильно читать строки ввода:
    • Создать сканер: scanner := bufio.NewScanner(os.Stdin)
    • Для каждой строки ввода вызвать scanner.Scan(), а затем scanner.Text()
    • Это гарантирует, что названия и имена авторов, содержащие пробелы, будут прочитаны правильно
  5. Разобрать входные данные и создать экземпляр Book
  6. Вызвать метод displayInfo, чтобы вывести информацию о книге
  7. Вызвать метод 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 и вызовите методы
    
}
quiz iconПроверьте себя

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

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

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