Tworzenie prostego pakietu
Część sekcji Logika i przepływ sterowania ścieżki GO w Coddy. Lekcja 53 z 68.
Teraz czas stworzyć własny, niestandardowy pakiet! Tworzenie pakietów pozwala organizować kod w wielokrotnego użytku moduły, które można importować i wykorzystywać w różnych programach.
Aby utworzyć pakiet, zacznij od zadeklarowania go na początku pliku za pomocą słowa kluczowego package, po którym następuje nazwa pakietu. W przypadku naszego pakietu kalkulatora użyjemy:
package calculatorW tym pakiecie możesz definiować funkcje, zmienne i typy. Pamiętaj, że z innych pakietów będą dostępne tylko eksportowane identyfikatory (te zaczynające się wielką literą). Oto jak możesz zdefiniować eksportowaną funkcję Add:
package calculator
func Add(a, b int) int {
return a + b
}Aby użyć własnego pakietu z innego pliku, importujesz go tak samo jak każdy inny pakiet. Następnie z pakietu main możesz wywoływać wyeksportowane funkcje:
package main
import "calculator"
func main() {
result := calculator.Add(5, 3)
}To modułowe podejście sprawia, że kod jest lepiej uporządkowany i pozwala ponownie wykorzystywać funkcjonalność w wielu programach bez powielania kodu.
Wyzwanie
ŁatwyUtwórz niestandardowy pakiet mathutils z podstawowymi operacjami matematycznymi, a następnie użyj go w swoim programie głównym. To wyzwanie sprawdzi Twoją umiejętność tworzenia pakietu, definiowania eksportowanych funkcji i importowania niestandardowego pakietu do użycia w innym programie.
Otrzymasz dwa wejścia:
- Łańcuch zawierający definicje funkcji w formacie
"function1:param1,param2:operation|function2:param1,param2:operation"(np."Add:5,3:addition|Multiply:4,7:multiplication|Subtract:10,4:subtraction") - Łańcuch zawierający żądania obliczeń w formacie
"operation1:value1,value2|operation2:value1,value2|operation3:value1,value2"(np."Add:15,25|Multiply:6,8|Subtract:50,20")
Twoje zadanie:
- Utwórz pakiet
mathutils, deklarującpackage mathutilsna początku - Przeanalizuj pierwsze wejście, dzieląc je na pionowych kreskach (
|), aby uzyskać poszczególne definicje funkcji - Dla każdej definicji funkcji podziel ją po dwukropkach, aby uzyskać nazwę funkcji, parametry i typ operacji
- Utwórz następujące eksportowane funkcje w pakiecie
mathutils:Add(a, b int) int— zwraca sumę a i bSubtract(a, b int) int— zwraca różnicę a i bMultiply(a, b int) int— zwraca iloczyn a i bDivide(a, b int) int— zwraca wynik dzielenia a przez b (dzielenie całkowite)
- W programie głównym zaimportuj pakiet
mathutils - Wyświetl nagłówek z informacją o pakiecie:
"=== MATHUTILS PACKAGE DEMO ===" - Przeanalizuj pierwsze wejście i wyświetl dostępne funkcje:
"Available functions in mathutils package:"- Dla każdej funkcji:
"- [function_name]: Performs [operation_type] on two integers"
- Przeanalizuj drugie wejście, dzieląc je na pionowych kreskach, aby uzyskać poszczególne żądania obliczeń
- Dla każdego żądania obliczenia podziel je po dwukropkach, aby uzyskać nazwę funkcji i parametry
- Podziel parametry po przecinkach, aby uzyskać dwie wartości całkowite
- Przekonwertuj ciągi parametrów na liczby całkowite za pomocą
strconv.Atoi - Wyświetl nagłówek procesu obliczeń:
"Performing calculations:" - Dla każdego żądania obliczenia:
- Wywołaj odpowiednią funkcję z pakietu
mathutils - Wyświetl:
"mathutils.[function_name]([param1], [param2]) = [result]"
- Wywołaj odpowiednią funkcję z pakietu
- Oblicz i wyświetl statystyki podsumowujące:
"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]"
- Wyświetl potwierdzenie użycia pakietu:
"Package demonstration completed successfully""All functions from mathutils package executed correctly"
Użyj pakietu strings, aby podzielić ciągi wejściowe, pakietu strconv, aby przekonwertować ciągi na liczby całkowite, oraz pakietu fmt do formatowanego wyjścia. Pamiętaj, że tylko funkcje, których nazwy zaczynają się wielką literą, będą eksportowane i dostępne z innych pakietów.
Ważne: Oba wiersze wejściowe używają pionowych kresek (|) jako separatora między elementami. Każdy element pierwszego wejścia ma format FunctionName:param1,param2:operationtype: najpierw podziel po |, a następnie podziel każdy element po :, aby wyodrębnić nazwę funkcji (indeks 0) i typ operacji (indeks 2).
To wyzwanie pokazuje, jak tworzyć kod wielokrotnego użytku za pomocą niestandardowych pakietów oraz jak organizować funkcjonalność w logiczne moduły.
Spróbuj swoich sił
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
// TODO: Utwórz tutaj funkcje pakietu mathutils
// Ponieważ nie możemy używać osobnych plików, zdefiniuj funkcje bezpośrednio tutaj
// Normalnie znajdowałyby się one w osobnym pliku pakietu
func main() {
// Odczytaj dane wejściowe za pomocą bufio.Scanner, aby poprawnie obsłużyć spacje
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
functionDefs := scanner.Text()
scanner.Scan()
calcRequests := scanner.Text()
// TODO: Napisz swój kod poniżej
// 1. Zdefiniuj funkcje Add, Subtract, Multiply, Divide (symulując pakiet mathutils)
// 2. Przeanalizuj functionDefs: podziel według '|', aby uzyskać poszczególne definicje, a następnie podziel każdą według ':'
// Format: FuncName:param1,param2:operation (np. "Add:5,3:addition")
// 3. Wyświetl informacje o pakiecie i dostępne funkcje
// 4. Przeanalizuj calcRequests (podziel według '|') i wykonaj obliczenia
// 5. Wyświetl wyniki i statystyki podsumowujące
// Wyłącz ostrzeżenia o nieużywanych zmiennych
_ = functionDefs
_ = calcRequests
_ = fmt.Sprintf
_ = strconv.Atoi
_ = strings.Split
// Pamiętaj, aby wyświetlić wynik w wymaganym formacie, zgodnie z opisem zadania
}Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Logika i przepływ sterowania
1Zaawansowane sterowanie przepływem
Instrukcja switch z `fallthrough`Przerywanie zagnieżdżonych pętliKontynuowanie określonej pętliInstrukcja `goto`Podsumowanie — zaawansowane sterowanie pętlami4Projekt: Prosta lista zadań
Konfiguracja projektuDodawanie zadania2Struktury i metody
Definiowanie metod dla strukturOdbiorniki przez wartośćOdbiorniki przez wskaźnikWybór odbiornikówMetody a funkcjePodsumowanie — działanie struktur5Mapy w szczegółach
Mapy strukturWskaźniki jako wartości mapSprawdzanie, czy mapy są nilPorównywanie mapPodsumowanie — licznik częstości słów3Interfejsy (podstawy)
Czym jest interfejs?Definiowanie interfejsuImplementowanie interfejsuUżywanie typów interfejsowychPusty interfejsAsercje typuPrzełącznik typówPodsumowanie – kształty i zachowania6Idiomatyczny Go: zbiory
Idiom zbioru w GoTworzenie zbioruDodawanie elementów do zbioruSprawdzanie przynależnościUsuwanie elementów ze zbioruIterowanie po zbiorzePodsumowanie – unikalne nazwy użytkowników9Pakiety i zakres
Czym jest pakiet?Eksportowane a nieeksportowaneTworzenie prostego pakietuAliasy pakietówIdentyfikator pusty `_`Funkcja `init`Podsumowanie — tworzenie narzędziaPoćwicz samodzielnie: Kompilator Go online