Menu
Coddy logo textTech

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

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

quiz iconПроверьте себя

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

quiz iconПроверьте себя

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

quiz iconПроверьте себя

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

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 с получателем значения (value receiver), который выводит информацию о книге в формате: "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 и вывести возвращенное описание

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

Шпаргалка

Методы в 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 и вызовите методы
    
}
quiz iconПроверьте себя

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

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