Создание простого пакета
Часть раздела Логика и управление потоком путешествия по GO на Coddy. Урок 53 из 68.
Теперь пришло время создать собственный пользовательский пакет! Создание пакетов позволяет организовать код в повторно используемые модули, которые можно импортировать и использовать в разных программах.
Чтобы создать пакет, начни с его объявления в верхней части своего file с помощью ключевого слова package, за которым следует имя пакета. Для нашего пакета calculator мы будем использовать:
package calculatorВнутри этого пакета можно определять Functions, переменные и типы. Помни, что только экспортируемые идентификаторы (начинающиеся с заглавной буквы) будут доступны из других пакетов. Вот как можно определить экспортируемую Add function:
package calculator
func Add(a, b int) int {
return a + b
}Чтобы использовать свой пользовательский пакет из другого файла, вы импортируете его так же, как любой другой пакет. Затем из своего пакета main вы можете вызывать экспортированные functions:
package main
import "calculator"
func main() {
result := calculator.Add(5, 3)
}Этот модульный подход делает ваш код более организованным и позволяет повторно использовать функциональность в нескольких программах, не дублируя код.
Задание
ЛегкоCreate пользовательский пакет mathutils с базовыми математическими операциями, а затем используй его из своей основной программы. Это challenge проверит твою способность Create пакет, define экспортируемые функции и import пользовательский пакет для использования в другой программе.
Ты получишь два входных значения:
- Строку, содержащую определения function в формате
"function1:param1,param2:operation|function2:param1,param2:operation"(например,"Add:5,3:addition|Multiply:4,7:multiplication|Subtract:10,4:subtraction") - Строку, содержащую запросы calculation в формате
"operation1:value1,value2|operation2:value1,value2|operation3:value1,value2"(например,"Add:15,25|Multiply:6,8|Subtract:50,20")
Твоя задача:
- Create пакет
mathutils, объявивpackage mathutilsв верхней части - Разобрать первый вход, разделив его по вертикальным чертам (
|), чтобы получить отдельные определения function - Для каждого определения function разделить строку по двоеточиям, чтобы получить имя function, параметры и тип operation
- Create следующие экспортируемые функции в своём пакете
mathutils:Add(a, b int) int— возвращает сумму a и bSubtract(a, b int) int— возвращает a минус bMultiply(a, b int) int— возвращает произведение a и bDivide(a, b int) int— возвращает a, делённое на b (целочисленное деление)
- В своей основной программе import пакет
mathutils - Display заголовок information пакета:
"=== MATHUTILS PACKAGE DEMO ===" - Разобрать первый вход и Display доступные функции:
"Available functions in mathutils package:"- Для каждой функции:
"- [function_name]: Performs [operation_type] on two integers"
- Разобрать второй вход, разделив его по вертикальным чертам, чтобы получить отдельные запросы calculation
- Для каждого запроса calculation разделить строку по двоеточиям, чтобы получить имя function и параметры
- Разделить параметры по запятым, чтобы получить два целых значения
- Преобразовать строки параметров в целые числа с помощью
strconv.Atoi - Display заголовок процесса calculation:
"Performing calculations:" - Для каждого запроса calculation:
- Вызвать соответствующую функцию из пакета
mathutils - Display:
"mathutils.[function_name]([param1], [param2]) = [result]"
- Вызвать соответствующую функцию из пакета
- Вычислить и Display сводную статистику:
"Calculation Summary:""Total calculations performed: [number_of_calculations]""Functions used: [comma_separated_list_of_unique_function_names_used]""Sum of all results: [sum_of_all_calculation_results]"
- Display подтверждение использования пакета:
"Package demonstration completed successfully""All functions from mathutils package executed correctly"
Используй пакет strings, чтобы разделять входные строки, пакет strconv — для преобразования строк в целые числа, а пакет fmt — для форматированного вывода. Помни, что только функции, начинающиеся с заглавных букв, будут экспортированы и доступны из других пакетов.
Важно: обе входные строки используют вертикальные черты (|) как разделитель между элементами. Каждая запись в первом входе имеет формат FunctionName:param1,param2:operationtype: сначала раздели строку по |, затем раздели каждую запись по :, чтобы извлечь имя function (индекс 0) и тип operation (индекс 2).
Этот challenge демонстрирует, как Create повторно используемый код с помощью пользовательских пакетов и как организовать функциональность в логические модули.
Попробуйте сами
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
// TODO: Create your mathutils package functions here
// Поскольку мы не можем использовать отдельные файлы, определите функции напрямую
// Обычно они находились бы в отдельном файле пакета
func main() {
// Читаем ввод с помощью bufio.Scanner для правильной обработки пробелов
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
functionDefs := scanner.Text()
scanner.Scan()
calcRequests := scanner.Text()
// TODO: Напишите ваш код ниже
// 1. Define Add, Subtract, Multiply, Divide functions (simulating mathutils package)
// 2. Разберите functionDefs: разделите по '|' чтобы получить каждое определение, затем разделите каждое по ':'
// Формат: FuncName:param1,param2:operation (например, "Add:5,3:addition")
// 3. Display package information and available functions
// 4. Parse calcRequests (split by '|'), perform calculations
// 5. Отобразите результаты и сводную статистику
// Подавить предупреждения о неиспользуемых переменных
_ = functionDefs
_ = calcRequests
_ = fmt.Sprintf
_ = strconv.Atoi
_ = strings.Split
// Не забудьте вывести требуемый формат, как указано в задании
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком выполнения
Switch с использованием `fallthrough`Выход из вложенных цикловПродолжение конкретного циклаОператор `goto`Итоги: Продвинутое управление циклами4Проект: Простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели по значениюПолучатели по указателюВыбор типа получателяМетоды против функцийИтоги: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картИтоги: счетчик частоты слов3Интерфейсы (Основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование интерфейсных типовПустой интерфейсУтверждение типаПереключатель типовИтоги: Фигуры и поведение6Идиоматичный Go: Множества
Идиома множества в GoСоздание множестваДобавление в множествоПроверка наличия элементаУдаление из множестваИтерация по множествуИтоги — Уникальные имена пользователей9Пакеты и область видимости
Что такое пакет?Экспортируемые и неэкспортируемые элементыСоздание простого пакетаПсевдонимы пакетовПустой идентификатор `_`Функция `init`Итоги: создание утилитыПотренируйтесь самостоятельно: Онлайн-компилятор Go