一、基础初始化
m := make(map[string]int)
m["foo"] = 1
m["bar"] = 2
fmt.Println(m) // map[foo:1 bar:2]
基础的map初始化非常简单,通过make函数直接创建即可。然后使用m[key]=value的方式给map添加元素。这种方式是最常见的,也是最简单的方式。
但是需要注意的是,如果我们直接访问一个不存在的key,map会返回一个空值,而不是报错。因此在使用map时需要特别注意这一点。
二、初始化及默认值
m := map[string]int{
"foo": 1,
"bar": 2,
}
fmt.Println(m) // map[foo:1 bar:2]
除了使用make函数初始化map外,还可以使用字面量方式初始化map。这种方式的语法比较简洁,直接在大括号内列出key-value对即可。
在使用该方式时,我们还可以指定map中元素的默认值。例如如下示例代码:
m := map[string]int{
"foo": 1,
}
fmt.Println(m["bar"]) // 0
在定义map时,我们可以指定value的类型(例如int、string等),但是并不能指定value的真实值。默认情况下,map中的所有value都是对应类型的零值。
三、元素删除
m := map[string]int{
"foo": 1,
"bar": 2,
}
delete(m, "foo")
fmt.Println(m) // map[bar:2]
如上代码所示,使用delete函数可以删除map中的元素。delete函数的第一个参数是需要删除元素的map,第二个参数是需要删除的元素的key。
需要注意的是,如果访问一个不存在的key,map会返回一个空值,但删除一个不存在的key不会有任何效果。
四、遍历map
m := map[string]int{
"foo": 1,
"bar": 2,
}
for k, v := range m {
fmt.Printf("key:%s,value:%d\n", k, v)
}
在Golang中,遍历map使用for range语句。for range语句将map中的key-value对依次赋值给前两个变量(k和v)。可以使用这些变量在循环体内对map中的元素进行操作。
需要注意的是,map的遍历顺序是不确定的。如果需要特定顺序访问map中的元素,需要添加排序逻辑。
五、字符串作为key
m := make(map[string]int)
m["1"] = 1
m[1] = 2
fmt.Println(m["1"]) // 1
fmt.Println(m[1]) // 2
Golang中的map可以使用多种不同类型作为key,包括字符串、数字、自定义类型等。
需要注意的是,如果我们同时使用字符串和数字作为key,则会发生类型转换。例如如上所示的示例代码中,"1"和1被视作两个不同的key。如果在map中同时使用了这两个key,会分别对应两个不同的value。
六、自定义类型作为key
type Person struct {
Name string
Age int
}
m := make(map[Person]int)
p := Person{"张三", 18}
m[p] = 1
fmt.Println(m[p]) // 1
除了基本类型和字符串外,Golang中的map还可以使用自定义类型作为key。在这种情况下,需要确保自定义类型是可比较的。
可比较的类型包括:
- 数值类型
- 字符类型
- 布尔类型
- 指针类型
- 数组类型,数组元素为可比较类型
- 结构体类型,结构体中所有成员都是可比较类型
如果自定义类型不满足以上条件,需要实现自定义类型的比较方法。