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

פונקציות וריאדיות

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

הַצהָרָה

Go
func sum(nums ...int) int {
    tot := 0
    for _, n := range nums {
        tot += n
    }
    return tot
}

sum()              // 0   (nums = []int{})
sum(1)             // 1
sum(1, 2, 3, 4)    // 10

רק הפרמטר האחרון יכול להיות וריאדי:

Go
func log(prefix string, values ...any) { ... }   // ok
// func wrong(...int, suffix string) {}            // ERRORE

מורחים פרוסה

אם כבר יש לך פרוסה, אתה יכול להעביר אותו לפונקציה וריאדית עם ...:

Go
nums := []int{1, 2, 3}
sum(nums...)         // 6 — espande lo slice nei singoli argomenti

ה"..." הולך אחרי הפרוסה. בלי ממרח תקבל סוג שגיאה: היית מעביר []int שבו הפונקציה מצפה לרצף מתוך int.

nums הוא פרוסה, לא מיכל חדש

בתוך הפונקציה nums יש סוג []int. הכל פרוסה סטנדרטית פעולות פעולות: len(nums), nums[0], range וכו'.

מקרה שימוש קלאסי: fmt.Println

כל הפונקציות Print* של fmt הן שונות:

Go
// signature (semplificata):
// func Println(a ...any) (n int, err error)

fmt.Println("ciao", 42, true)
args := []any{"a", "b", "c"}
fmt.Println(args...)

נסה את זה

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

הגדר sum(nums ...int) int שמחזיר את הסכום של כל הארגומנטים.

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

בתוך הפונקציה `nums` יש את הסוג `[]int`.

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

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

קרא לפונקציית הסכום הקיימת על ידי העברת מספרי הפרוסה עם התפלגות `nums...`.

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

ה-'...' הולך אחרי שם הפרוסה.

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

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

בתוך `func f(args ...string)`, איזה סוג הוא `args`?

Go
func f(args ...string) {
    _ = args
}
אפשרויות תשובה

לְסַכֵּם

  • ...T כפרמטר LAST = פונקציה וריאדית; בפנים זה []T.
  • נקרא עם ערכים בודדים: המהדר אוסף אותם לפרוסה.
  • נקרא עם פרוסה קיימת: slice... (מורחים, עושה שימוש חוזר בפרוסה).
  • כל הפונקציות fmt.Print* הן וריאדיות.
  • רק הפרמטר האחרון יכול להיות וריאדי.