Menu
CoddyTech

复制映射

Coddy Go 中的切片和映射 课程的第 18 课,共 21 课。

和切片一样,我们可以复制一个映射,并向其中添加新值。

来看这样一个映射:

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:", )
}

Go 中的切片和映射中的所有课

自己练习: Go 在线编译器