Go语言提供的字典容器为 map,等同于Java语言的Map容器类型。
1.Map初始化与遍历
package main
import "fmt"
func main() {
// 定义一个键类型为string,值类型为string的 map
citys := make(map[string]string)
citys["010"] = "北京"
citys["020"] = "广州"
citys["021"] = "上海"
citys["029"] = "西安"
citys["027"] = "武汉"
citys["025"] = "南京"
fmt.Println(citys)
//输出一个不存在的key
fmt.Println("099:", citys["099"])
}
运行结果:
map[010:北京 020:广州 021:上海 025:南京 027:武汉 029:西安]
099:
map的另外一种初始化方式,类似json对象的初始化,但是必须注意最后一项也必须以逗号结尾:
package main
import (
"fmt"
)
func main() {
citys := map[string](string){
"010": "北京",
"021": "上海",
"020": "广州",
"029": "西安",
"027": "武汉",
}
fmt.Println(citys)
fmt.Println("-------------------------")
//map的遍历
// 通过 for range 遍历, 获取 key, value 值并打印
for key, value := range citys {
fmt.Printf("key: %s, value: %s\n", key, value)
}
fmt.Println("-------------------------")
//只遍历值,也可以通过Go语言的匿名变量来实现
for _, value := range citys {
fmt.Printf("value: %s\n", value)
}
fmt.Println("-------------------------")
//只遍历键
for key := range citys {
fmt.Printf("key: %s\n", key)
}
}
运行结果:
map[010:北京 020:广州 021:上海 027:武汉 029:西安]
-------------------------
key: 010, value: 北京
key: 021, value: 上海
key: 020, value: 广州
key: 029, value: 西安
key: 027, value: 武汉
-------------------------
value: 北京
value: 上海
value: 广州
value: 西安
value: 武汉
-------------------------
key: 021
key: 020
key: 029
key: 027
key: 010
2.修改与删除
package main
import "fmt"
func main() {
citys := map[string](string){
"010": "北京",
"021": "上海",
"020": "广州",
"029": "西安",
"027": "武汉",
"026": "null",
}
//map的遍历
// 通过 for range 遍历, 获取 key, value 值并打印
for key, value := range citys {
fmt.Printf("key: %s, value: %s\n", key, value)
}
citys["026"] = "台北"
fmt.Println("---------------------------------")
for key, value := range citys {
fmt.Printf("key: %s, value: %s\n", key, value)
}
delete(citys, "026")
fmt.Println("---------------------------------")
for key, value := range citys {
fmt.Printf("key: %s, value: %s\n", key, value)
}
}
运行结果:
key: 020, value: 广州
key: 029, value: 西安
key: 027, value: 武汉
key: 026, value: null
key: 010, value: 北京
key: 021, value: 上海
---------------------------------
key: 026, value: 台北
key: 010, value: 北京
key: 021, value: 上海
key: 020, value: 广州
key: 029, value: 西安
key: 027, value: 武汉
---------------------------------
key: 010, value: 北京
key: 021, value: 上海
key: 020, value: 广州
key: 029, value: 西安
key: 027, value: 武汉
3.并发Map使用sync.Map
Go语言的map在并发环境下,只读是线程安全的,同时读写是线程不安全的。Go 语言在1.9版本中提供了一种高效率的并发安全的sync.Map。
sync.Map 有以下特性:
package main
import (
"fmt"
"sync"
)
func main() {
var m sync.Map
// 添加一些键值对到 map 中
m.Store("010", "北京")
m.Store("021", "上海")
m.Store("029", "西安")
m.Store("026", "台北")
// 从 sync.Map 中获取键为 029 的值
fmt.Println(m.Load("029"))
fmt.Println("------------------------")
// 遍历 sync.Map 中的键值对
m.Range(func(key, value interface{}) bool {
fmt.Printf("key: %s, value: %s\n", key, value)
return true
})
// 删除键值对
m.Delete("026")
fmt.Println("------------------------")
// 遍历 sync.Map 中的键值对
m.Range(func(key, value interface{}) bool {
fmt.Printf("key: %s, value: %s\n", key, value)
return true
})
}
运行结果:
西安 true
------------------------
key: 010, value: 北京
key: 021, value: 上海
key: 029, value: 西安
key: 026, value: 台北
------------------------
key: 029, value: 西安
key: 010, value: 北京
key: 021, value: 上海