Map是一种无序的键值对形式的数据类型
{key1:value1, key2:value2, key3:value3, ...}
Map 是无序的,我们无法决定它的返回顺序, 因为它是由Hash实现的
通过map的key可以获取对应的值
定义Map(2种方式):
1.通过内建函数make
var v_map = make(map[key_type]value_type) // 数据类型为: map[key_type]value_type
2.通过初始化定义map
m := map[string]string {
"a": "abc",
"b": "bca", // 每行的末尾须要加上逗号, 才能通过编译
}
直接写作: var m map[string]string, 是不能使用的, 因为没有开辟空间
必须要像上面两种方式 m["A"] = "abc", 这样是错误的操作
向Map中存放键值对
var cmap = make(map[string]string) // 创建Map, 变量为cmap
cmap ["China"] = "中国" // 向cmap中添加键值对
cmap ["America"] = "美国"
for循环遍历Map
for k, v := range cmap {
fmt.Print(v)
}
大部份的数据类型都可以做为map的键和值
如下是map的value类型为一个map:
func main() {
a := make(map[string]map[string]string, 10)
a["A"] = make(map[string]string)
a["A"]["1"] = "A1" // a["A"] 是一个map, 所以可写作a["A"]key = value
a["A"]["2"] = "A2"
fmt.Println(a) // map[A:map[1:A1 2:A2]]
}
查看map中是否存在某元素
val, flag := map[key], 如果有该元素, 则flag为真, 否则为假
func main() {
m := make(map[string]map[string]string) // map作为信息存储单元
m["zhangsan"] = make(map[string]string) // 插入一个信息
m["zhangsan"]["nikename"] = "xiaozhang" // 具体信息
m["zhangsan"]["password"] = "111111111"
m["zhangsan"]["birthday"] = "222222222"
modify("zhangsan", m)
fmt.Println(m) // map[zhangsan:map[nikename:xxxxxx password:123456 birthday:222222222]]
}
/*更改用户信息, 若不存在该用户, 则创建*/
func modify(user string, info map[string]map[string]string) {
val, ok := info[user] // 获取user, 如果没有获取到, 则ok为false
if !ok { // 也可以使用 if (info[user] == nil) {...}
info[user] = make(map[string]string) // 如果没有获取到该user, 创建它
}
// 赋值或更改信息
val["password"] = "123456"
val["nikename"] = "xxxxxx"
}
map可以删除元素
delete(cmap, c_key)
如果要清空map中的所有元素, 则for循环一个个删除元素
没有直接清空map元素的函数
len(map)求元素个数
func main() {
cmap := map[string]string{"a":"A", "b":"B", "c":"C"}
for _, v := range cmap {
fmt.Println(v)
}
delete(cmap, "c")
fmt.Println(cmap) // map[a:A b:B]
fmt.Println(len(cmap)) // 2
}
切片与map结合
无论是切片还是map, 在使用前都必须初始化, 否则panic
如果没有初始化, 则它就是nil, 因此在使用前, 通常会通过nil来判断它
func main() {
sli := make([]map[int]string, 3)
if sli[0] == nil { // 用切片或map前通常使用nil判断是否初始化
sli[0] = make(map[int]string)
}
sli[0][1] = "俄罗斯"
sli[0][2] = "加拿大"
sli[0][3] = "中国"
if sli[1] == nil {
sli[1] = make(map[int]string)
}
sli[1][97] = "a"
sli[1][98] = "b"
sli[1][99] = "c"
fmt.Println(sli) // [map[1:俄罗斯 2:加拿大 3:中国] map[97:a 98:b 99:c] map[]]
}
// 从结果来看, 该切片中前两个初始化了, 但第三个是空的, 因为它没有安初始化
map是无序的
但是可以排序map的键, 再根据键得到值
func main() {
m := make(map[int]int)
m[1] = 4
m[2] = 8
m[0] = 5
m[9] = 0
m[3] = 3
var keys []int // 用切片储存map的key, 便于排序
for k, _ := range m {
keys = append(keys, k)
}
sort.Ints(keys) // 调用函数给切片排序排序
for _, v := range keys { // 循环切片, 即循环map的key
fmt.Println(v, m[v])
}
}