复制映射
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]现在,修改一个映射不会影响另一个映射。
挑战
简单在给定的代码中,我们定义了一个名为 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 在线编译器