Menu
Coddy logo textTech

ערך לעומת הפניה

שיעור 7 מתוך 19 בקורס פונקציות ומצביעים ב-Golang של Coddy.

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

נבחן תוכנית כזאת:

func main() {
    a := 5
    fmt.Println("value of a:", a)
    sum(a)
    fmt.Println("value of a after addition:", a)
}
func sum(x int) {
    x = x + x
}

בתוכנית הזאת אנחנו מצהירים על משתנה a, מדפיסים את הערך שלו ואז מעבירים אותו לפונקציה שנקראת sum. הפונקציה הזאת מבצעת את החיבור 5 + 5. מה לדעתך תהיה התוצאה של הקוד הזה?

נריץ אותו ונראה:

value of a: 5
value of a after addition: 5

אין שינוי. יש כאן בעיה; הערך של a אמור להיות 10 אחרי הקריאה לפונקציה sum, נכון?

ובכן, לא, כי ב-Go, כשמעבירים ערך לפונקציה, אנחנו רק מעתיקים אותו, וכשמשנים את הערך, השינויים לא מופיעים מחוץ לפונקציה. הערך משתנה רק בתוך הפונקציה. אפשר לראות זאת אם נדפיס את הערך בתוך הפונקציה sum:

func main() {
    a := 5
    fmt.Println("value of a:", a)
    sum(a)
    fmt.Println("value of a after addition:", a)
}
func sum(x int) {
    x = x + x
    fmt.Println("value inside the function:", x)
}

אם נריץ את זה, נקבל:

value of a: 5
value inside the function: 10
value of a after addition: 5

כלומר, הערך משתנה בתוך הפונקציה (התחום של הפונקציה), אבל מחוץ לפונקציה הערך לא משתנה.

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

עכשיו זה ברור. כך נוצר משתנה חדש עם כתובת שונה (וזה גם לא טוב לזיכרון !).

זאת הסיבה שאנחנו לא רואים את השינויים, כי המשתנים שונים😅.

כדי לפתור את הבעיה הזאת, אפשר להשתמש במצביע במקום בעותק של הערך, כך:

func main() {
    a := 5
    fmt.Println("value of a:", a)
    sum(&a)
    fmt.Println("value of a after addition:", a)
}
func sum(x *int) {
    *x += *x
}

עכשיו, במקום את הערך, אנחנו מעבירים את כתובת הזיכרון sum(&a). פירוש הדבר הוא שהפונקציה תעבוד עם אותו המשתנה עצמו ולא תיצור משתנה חדש.

 

challenge icon

אתגר

קל

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

נסו בעצמכם

package main

import "fmt"


func swapValues(a, b int) {
	
  a, b = b, a
}

func main() {
	var x, y int = 4,10

	fmt.Println("Before swap:")
	fmt.Println("x =", x)
	fmt.Println("y =", y)

	swapValues(x, y)

	fmt.Println("After swap:")
	fmt.Println("x =", x)
	fmt.Println("y =", y)
}

כל השיעורים ביחידה פונקציות ומצביעים ב-Golang

תרגלו בעצמכם: קומפיילר Go אונליין