Menu
Coddy logo textTech

העתקת מפה

שיעור 18 מתוך 21 בקורס פרוסות ומפות ב-GoLang של Coddy.

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

נבחן מפה כזאת:

products := map[string]int{
   "MacBook": 5000,
   "iPhone": 1000,
   "Vision pro": 3000,
}

נניח שעלינו להעתיק את המפה products:

list := products

הפעולה הזאת תיצור עותק של המפה products אל list. עם זאת, הבעיה היא ששינויים שנערכים במפה אחת ישפיעו על השנייה, מכיוון שהן חולקות את אותו מרחב זיכרון. אפשר לוודא זאת על ידי הדפסת כתובות הזיכרון שלהן:

fmt.Printf("%p \n", list)
fmt.Printf("%p", products)

הפלט הוא:

0xc00010e0c0 
0xc00010e0c0

הפתרון כאן הוא להשתמש במילת המפתח make. תחילה נצהיר על מפה באמצעות מילת המפתח make:

list := make(map[string]int)

עכשיו, אולי תשאלו מה ההבדל בין שימוש ב-make לבין הצהרה פשוטה כמו זו:

list := map[string]int{}

למעשה, אין הבדל, מלבד העובדה שבעזרת make אפשר להגדיר אורך למפה.

list := make(map[string]int, len(products))

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

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

כעת, לאחר שהגדרנו את המפה החדשה שלנו, אפשר לעשות זאת באמצעות לולאה שתעתיק רכיבים מ-products למפה list:

list := make(map[string]int, len(products))
for key, value := range products {
   list[key] = value
}

התוצאה תהיה:

map[Golang Book:400 Python Book:300 Rust Book:500]

כעת, אם נשנה מפה אחת, השינוי לא ישפיע על המפה השנייה.
 

challenge icon

אתגר

קל

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

  • צרו מפה חדשה בשם productByPrice.
  • העתיקו את הפריטים מהמפה productByName, אבל בסדר הפוך: price יהיה המפתח, ו-name יהיה הערך.
  • הדפיסו את שתי המפות למסך.

נסו בעצמכם

package main

import "fmt"

func main() {
    // הגדירו מפה של מוצרים לפי שם. אל תשנו את זה!
    productByName := map[string]int{
        "MacBook":    5000,
        "iPhone":     1000,
        "Vision Pro": 3000,
    }

    // צרו מפה חדשה של מוצרים לפי מחיר
    

    // העתיקו רכיבים מ-productByName אל productByPrice
     

    // הדפיסו את שתי המפות למסך
    fmt.Println("By Name:", )
    fmt.Println("By Price:", )
}

כל השיעורים ביחידה פרוסות ומפות ב-GoLang

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