יצירת חבילה פשוטה
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-GO של Coddy. שיעור 53 מתוך 68.
עכשיו הגיע הזמן ליצור חבילה מותאמת אישית משלך! יצירת חבילות מאפשרת לך לארגן את הקוד שלך במודולים לשימוש חוזר שאפשר לייבא ולהשתמש בהם בתוכניות שונות.
כדי ליצור חבילה, מתחילים בהכרזה עליה בראש הקובץ באמצעות מילת המפתח package, ואחריה שם החבילה. עבור חבילת המחשבון שלנו, נשתמש ב:
package calculatorבתוך החבילה הזו אפשר להגדיר פונקציות, משתנים וטיפוסים. זכור שרק מזהים מיוצאים (אלה שמתחילים באות גדולה) יהיו נגישים מחבילות אחרות. כך אפשר להגדיר פונקציית Add מיוצאת:
package calculator
func Add(a, b int) int {
return a + b
}כדי להשתמש בחבילה המותאמת אישית שלך מקובץ אחר, מייבאים אותה בדיוק כמו כל חבילה אחרת. מתוך חבילת main שלך, אפשר לקרוא לפונקציות המיוצאות:
package main
import "calculator"
func main() {
result := calculator.Add(5, 3)
}הגישה המודולרית הזו הופכת את הקוד שלך למאורגן יותר ומאפשרת לך לעשות שימוש חוזר בפונקציונליות בכמה תוכניות בלי לשכפל קוד.
אתגר
קלצרו חבילת mathutils מותאמת אישית עם פעולות מתמטיות בסיסיות, ואז השתמשו בה מתוך התוכנית הראשית שלכם. האתגר הזה יבחן את היכולת שלכם ליצור חבילה, להגדיר פונקציות מיוצאות ולייבא את החבילה המותאמת אישית שלכם לשימוש בתוכנית אחרת.
תקבלו שתי קלטים:
- מחרוזת המכילה הגדרות של פונקציות בפורמט
"function1:param1,param2:operation|function2:param1,param2:operation"(למשל,"Add:5,3:addition|Multiply:4,7:multiplication|Subtract:10,4:subtraction") - מחרוזת המכילה בקשות חישוב בפורמט
"operation1:value1,value2|operation2:value1,value2|operation3:value1,value2"(למשל,"Add:15,25|Multiply:6,8|Subtract:50,20")
עליכם:
- ליצור חבילת
mathutilsבאמצעות הצהרתpackage mathutilsבראש הקובץ - לנתח את הקלט הראשון על ידי פיצול לפי קווים אנכיים (
|) כדי לקבל את הגדרות הפונקציות הבודדות - עבור כל הגדרת פונקציה, לפצל לפי נקודתיים כדי לקבל את שם הפונקציה, הפרמטרים וסוג הפעולה
- ליצור את הפונקציות המיוצאות הבאות בחבילת
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 (חלוקה של מספרים שלמים)
- לייבא את חבילת
mathutilsלתוכנית הראשית שלכם - להציג את כותרת פרטי החבילה:
"=== MATHUTILS PACKAGE DEMO ===" - לנתח את הקלט הראשון ולהציג את הפונקציות הזמינות:
"Available functions in mathutils package:"- עבור כל פונקציה:
"- [function_name]: Performs [operation_type] on two integers"
- לנתח את הקלט השני על ידי פיצול לפי קווים אנכיים כדי לקבל את בקשות החישוב הבודדות
- עבור כל בקשת חישוב, לפצל לפי נקודתיים כדי לקבל את שם הפונקציה ואת הפרמטרים
- לפצל את הפרמטרים לפי פסיקים כדי לקבל את שני הערכים השלמים
- להמיר את מחרוזות הפרמטרים למספרים שלמים באמצעות
strconv.Atoi - להציג את כותרת תהליך החישוב:
"Performing calculations:" - עבור כל בקשת חישוב:
- לקרוא לפונקציה המתאימה מתוך חבילת
mathutils - להציג:
"mathutils.[function_name]([param1], [param2]) = [result]"
- לקרוא לפונקציה המתאימה מתוך חבילת
- לחשב ולהציג נתונים סטטיסטיים מסכמים:
"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]"
- להציג אישור על השימוש בחבילה:
"Package demonstration completed successfully""All functions from mathutils package executed correctly"
השתמשו בחבילת strings כדי לפצל את מחרוזות הקלט, בחבילת strconv כדי להמיר מחרוזות למספרים שלמים, ובחבילת fmt להפקת פלט מעוצב. זכרו שרק פונקציות ששמן מתחיל באותיות גדולות מיוצאות ונגישות מחבילות אחרות.
חשוב: בשתי שורות הקלט משתמשים בקווים אנכיים (|) כמפרידים בין פריטים. לכל פריט בקלט הראשון יש את הפורמט FunctionName:param1,param2:operationtype: פצלו תחילה לפי |, ואז פצלו כל פריט לפי : כדי לחלץ את שם הפונקציה (אינדקס 0) ואת סוג הפעולה (אינדקס 2).
האתגר הזה מדגים כיצד ליצור קוד לשימוש חוזר באמצעות חבילות מותאמות אישית וכיצד לארגן פונקציונליות במודולים לוגיים.
נסו בעצמכם
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
// TODO: צרו כאן את הפונקציות של החבילה mathutils
// מכיוון שאי אפשר להשתמש בקבצים נפרדים, הגדירו את הפונקציות ישירות
// בדרך כלל הן היו נמצאות בקובץ נפרד של החבילה
func main() {
// קראו קלט באמצעות bufio.Scanner כדי לטפל כראוי ברווחים
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
functionDefs := scanner.Text()
scanner.Scan()
calcRequests := scanner.Text()
// TODO: כתבו את הקוד שלכם למטה
// 1. הגדירו את הפונקציות Add, Subtract, Multiply, Divide (כהדמיה של החבילה mathutils)
// 2. נתחו את functionDefs: פצלו לפי '|' כדי לקבל כל הגדרה, ואז פצלו כל אחת לפי ':'
// פורמט: FuncName:param1,param2:operation (לדוגמה "Add:5,3:addition")
// 3. הציגו מידע על החבילה ועל הפונקציות הזמינות
// 4. נתחו את calcRequests (פצלו לפי '|') ובצעו את החישובים
// 5. הציגו את התוצאות ואת נתוני הסיכום
// מנעו אזהרות על משתנים שאינם בשימוש
_ = functionDefs
_ = calcRequests
_ = fmt.Sprintf
_ = strconv.Atoi
_ = strings.Split
// זכרו להציג את הפלט בפורמט הנדרש, כפי שצוין באתגר
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
1בקרת זרימה מתקדמת
switch עם `fallthrough`יציאה מלולאות מקוננותהמשך לולאה מסוימתהצהרת `goto`סיכום – שליטה מתקדמת בלולאות4פרויקט: רשימת משימות פשוטה
הגדרת הפרויקטהוספת משימה2מבנים ושיטות
הגדרת שיטות במבניםמקבלי ערךמקבלי מצביעבחירת מקבליםשיטות לעומת פונקציותסיכום — התנהגות המבנים5מפות לעומק
מפות של Structsמצביעים כערכים במפהבדיקה אם מפות הן nilהשוואת מפותסיכום - מונה תדירות מילים8פרויקט: ניהול מלאי פשוט
סקירת הפרויקטבדיקת המלאי3ממשקים (הבסיס)
מהו ממשק?הגדרת ממשקמימוש ממשקשימוש בטיפוסי ממשקממשק ריקבדיקות טיפוסמתג טיפוסיםסיכום – צורות והתנהגויות6קבוצות בסגנון המקובל ב-Go
דפוס הקבוצה ב-Goיצירת קבוצההוספה לקבוצהבדיקת חברות בקבוצההסרה מקבוצהמעבר על איברי קבוצהסיכום – שמות משתמש ייחודיים9חבילות ותחום נראות
מהי חבילה?מיוצא לעומת לא מיוצאיצירת חבילה פשוטהכינוי לחבילההמזהה הריק `_`הפונקציה `init`סיכום – בניית כלי עזרתרגלו בעצמכם: קומפיילר Go אונליין