דילוג לתוכן המרכזי
מודול 3 · שיעור 2 מתוך 512/50 בקורס~12 min
שיעורי מודול (2/5)

החזרות מרובות והחזרות בשם

ב-Go, פונקציה יכולה להחזיר ערכים מרובים. זה המנגנון ש מפעיל את תבנית (value, error) שכבר ראית וזו חודרת כל הספרייה הסטנדרטית.

החזרות מרובות

סוגי ההחזרות עוברים בין סוגריים, מופרדים בפסיקים:

Go
func divmod(a, b int) (int, int) {
    return a / b, a % b
}

q, r := divmod(17, 5) // q=3, r=2

הם מפורקים עם הקצאות מרובות. כדי לזרוק אחד מה ערכים משתמשים ב-_:

Go
_, r := divmod(17, 5) // solo il resto

התבנית הקנונית (T, error)

כמעט כל ה-stdlib עוקב אחריו. error הוא תמיד האחרון:

Go
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 ללא ארגומנטים מחזיר אותם ("עירום לחזור"):

Go
func divmod(a, b int) (q, r int) {
    q = a / b
    r = a % b
    return       // naked: ritorna q, r
}

החזרות עם שם מופיעות גם בטיפים לתיעוד, כך שהן שימושיות כצורה של תיעוד מוטבע עבור פונקציות מורכבות - לא רק לחזרה עירומה.

יותר משתי החזרות?

שום דבר לא מונע ממך (int, int, int, error), אבל אם אתה מרגיש צורך זה כמעט תמיד סימן שאתה צריך להחזיר struct:

Go
type Result struct {
    Sum  int
    Avg  float64
    Max  int
}

func analyze(nums []int) (Result, error) { ... }

נסה את זה

פעילות גופנית#go.m3.l2.e1
ניסיונות: 0טוען...

הגדר divmod(a, b int) (int, int) שמחזיר מנה ושארית.

טוען עורך...
הצג רמז

סוגי החזרה בין סוגריים: `(int, int)`.

הפתרון זמין לאחר 3 ניסיונות

פעילות גופנית#go.m3.l2.e2
ניסיונות: 0טוען...

יישם safeDiv(a, b int) (int, error): אם b == 0 החזר (0, errors.New('divisione per zero')), אחרת (a/b, nil).

טוען עורך...
הצג רמז

שגיאה תמיד כערך האחרון. בשגיאה: ערך אפס + שגיאה.

הפתרון זמין לאחר 3 ניסיונות

Quiz#go.m3.l2.e3
מוכן

מה תוכנית זו מדפיסה באמצעות החזרות עם שם?

Go
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 החזרות? אתה כנראה רוצה מבנה.