ערך לעומת הפניה
שיעור 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). פירוש הדבר הוא שהפונקציה תעבוד עם אותו המשתנה עצמו ולא תיצור משתנה חדש.
אתגר
קלבקוד הנתון, אנחנו מגדירים פונקציה שמחליפה בין שני ערכים. השלימו את הקוד כדי שהפונקציה תפעל ותשיג את התוצאה.
נסו בעצמכם
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
1מבוא
מבוא4בנייה מחדש של פונקציות מחרוזות ב-Go
מחרוזות ב-Golangפונקציית Joinפונקציית Containsפונקציית Indexאתגר סיכום #1תרגלו בעצמכם: קומפיילר Go אונליין