golang 映射

映射是一种数据结构,用于存储一系列无序的键值对。 映射里基于键来存储值。通过一个例子展示了映射里键值对是如何存储的。映射功 能强大的地方是,能够基于键快速检索数据。键就像索引一样,指向与该键关联的值。

映射的创建和初始化

// 创建一个映射,键的类型是 string,值的类型是 int
dict := make(map[string]int)
// 创建一个映射,键和值的类型都是 string
// 使用两个键值对初始化映射
dict := map[string]string{"Red": "#da1337", "Orange": "#e95a22"}

 映射的键可以是任何值。这个值的类型可以是内置的类型,也可以是结构类型,只要这个值 可以使用==运算符做比较。切片、函数以及包含切片的结构类型这些类型由于具有引用语义, 不能作为映射的键,使用这些类型会造成编译错误,

// 创建一个映射,使用字符串切片作为映射的键
dict := map[[]string]int{}
Compiler Exception:
invalid map key type []string

没有任何理由阻止用户使用切片作为映射的值,如代码清单 4-47 所示。这个在使用一个映射 键对应一组数据时,会非常有用。

// 创建一个映射,使用字符串切片作为值
dict := map[int][]string{}

使用映射

键值对赋值给映射,是通过指定适当类型的键并给这个键赋一个值来完成的

// 创建一个空映射,用来存储颜色以及颜色对应的十六进制代码
colors := map[string]string{}
// 将 Red 的代码加入到映射
colors["Red"] = "#da1337"

测试映射里是否存在某个键是映射的一个重要操作。这个操作允许用户写一些逻辑来确定是 否完成了某个操作或者是否在映射里缓存了特定数据。这个操作也可以用来比较两个映射,来确 定哪些键值对互相匹配,哪些键值对不匹配。 从映射取值时有两个选择。第一个选择是,可以同时获得值,以及一个表示这个键是否存在 的标志

// 获取键 Blue 对应的值
value, exists := colors["Blue"]
// 这个键存在吗?
if exists {
fmt.Println(value)

 迭代映射里的所有值和迭代数组或切片一样,使用关键字 range,如以下代码所示。 但对映射来说,range 返回的不是索引和值,而是键值对。

 

// 创建一个映射,存储颜色以及颜色对应的十六进制代码
colors := map[string]string{
"AliceBlue": "#f0f8ff",
"Coral": "#ff7F50",
"DarkGray": "#a9a9a9",
"ForestGreen": "#228b22",
}
// 显示映射里的所有颜色
for key, value := range colors {
fmt.Printf("Key: %s Value: %s\n", key, value)
} 

 如果想把一个键值对从映射里删除,就使用内置的 delete 函数

// 删除键为 Coral 的键值对
delete(colors, "Coral")
// 显示映射里的所有颜色
for key, value := range colors {
fmt.Printf("Key: %s Value: %s\n", key, value)
} 

在函数间传递映射

在函数间传递映射并不会制造出该映射的一个副本。实际上,当传递映射给一个函数,并对 这个映射做了修改时,所有对这个映射的引用都会察觉到这个修改

func main() {
// 创建一个映射,存储颜色以及颜色对应的十六进制代码
colors := map[string]string{
"AliceBlue": "#f0f8ff",
"Coral": "#ff7F50",
"DarkGray": "#a9a9a9",
"ForestGreen": "#228b22",
 }
// 显示映射里的所有颜色
for key, value := range colors {
fmt.Printf("Key: %s Value: %s\n", key, value)
 }
// 调用函数来移除指定的键
removeColor(colors, "Coral")
// 显示映射里的所有颜色
for key, value := range colors {
fmt.Printf("Key: %s Value: %s\n", key, value)
 }
}
// removeColor 将指定映射里的键删除
func removeColor(colors map[string]string, key string) {
delete(colors, key)
} 

可以看到,在调用了 removeColor 之后,main 函数里引用的映射中不再有 Coral 颜色了。这个特性和切片类似,保证可以用很小的成本来复制映射。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值