שיעורי מודול (2/5)
החזרות מרובות והחזרות בשם
ב-Go, פונקציה יכולה להחזיר ערכים מרובים. זה המנגנון ש
מפעיל את תבנית (value, error) שכבר ראית וזו חודרת
כל הספרייה הסטנדרטית.
החזרות מרובות
סוגי ההחזרות עוברים בין סוגריים, מופרדים בפסיקים:
func divmod(a, b int) (int, int) {
return a / b, a % b
}
q, r := divmod(17, 5) // q=3, r=2הם מפורקים עם הקצאות מרובות. כדי לזרוק אחד מה
ערכים משתמשים ב-_:
_, r := divmod(17, 5) // solo il restoהתבנית הקנונית (T, error)
כמעט כל ה-stdlib עוקב אחריו. error הוא תמיד האחרון:
func read(path string) ([]byte, error) {
data, err := os.ReadFile(path)
if err != nil {
return nil, fmt.Errorf("read %q: %w", path, err)
}
return data, nil
}מחזירים בשם
אתה יכול לתת שם לערכי ההחזרה: הם הופכים למשתנים מוצהרים מראש
אתחול לאפס, ו-return ללא ארגומנטים מחזיר אותם ("עירום
לחזור"):
func divmod(a, b int) (q, r int) {
q = a / b
r = a % b
return // naked: ritorna q, r
}החזרות עם שם מופיעות גם בטיפים לתיעוד, כך שהן שימושיות כצורה של תיעוד מוטבע עבור פונקציות מורכבות - לא רק לחזרה עירומה.
יותר משתי החזרות?
שום דבר לא מונע ממך (int, int, int, error), אבל אם אתה מרגיש צורך
זה כמעט תמיד סימן שאתה צריך להחזיר struct:
type Result struct {
Sum int
Avg float64
Max int
}
func analyze(nums []int) (Result, error) { ... }נסה את זה
הגדר divmod(a, b int) (int, int) שמחזיר מנה ושארית.
הצג רמז
סוגי החזרה בין סוגריים: `(int, int)`.
הפתרון זמין לאחר 3 ניסיונות
יישם safeDiv(a, b int) (int, error): אם b == 0 החזר (0, errors.New('divisione per zero')), אחרת (a/b, nil).
הצג רמז
שגיאה תמיד כערך האחרון. בשגיאה: ערך אפס + שגיאה.
הפתרון זמין לאחר 3 ניסיונות
מה תוכנית זו מדפיסה באמצעות החזרות עם שם?
func f() (a, b int) {
a = 1
b = 2
return
}
x, y := f()
fmt.Println(x, y)לְסַכֵּם
- מספר ערכים בין סוגריים:
func f() (T1, T2, error). - אמנה:
errorתמיד כערך האחרון; על שגיאה, ערך אפס + שגיאה. - החזרות עם שם מצהירות מראש על המשתנים ומאפשרות החזרות חשופות.
- עירום מחזיר רק בפונקציות קצרות מאוד; מעבר לכך, הקריאות נפגעת.
- יותר מ-2-3 החזרות? אתה כנראה רוצה מבנה.