map 是 key - value 类型的数据结构,本身是无序的
初始化
map 声明之后必须要初始化才能使用
初始化方法:
make
通过 make 可以分配内存空间,如果省略 size 的话,分配的空间会较少,当内存超出范围时会内存再分配
示例:
func main() {
foo := make(map[string]string, 10)
foo["key1"]= "value1"
fmt.Printf("%v", foo)
}
直接初始化
声明时直接写入值
func newMap() {
foo := map[string]string{
"key1": "value1",
"key2": "value2",
}
foo["key3"] = "value3"
fmt.Printf("%v", foo)
}
多层 map
在使用多层 map 时,每一层 map 都要先初始化才能使用
直接初始化
直接初始化示例:
func twoMap(){
foo := map[string]map[string]string{
"outer_key1": {
"inner_key1": "value1",
"inner_key2": "value2",
},
"outer_key2": {
"inner_key1": "value1",
},
}
fmt.Printf("%v", foo)
}
没有初始化的内层 map 如果要使用还需要通过 make 的方式进行初始化
通过 make 初始化
make 初始化示例:
func twoMakeMap() {
foo := make(map[string]map[string]string, 10)
foo["outer_key1"] = make(map[string]string)
foo["outer_key1"]["inner_key1"] = "value1"
foo["outer_key1"]["inner_key2"] = "value2"
foo["outer_key2"] = make(map[string]string)
foo["outer_key2"]["inner_key1"] = "value1"
fmt.Printf("%v", foo)
}
操作
插入 & 更新
在已经分配内存的前提下,更新时如果不存在相应 key 就会自动插入
func main() {
foo := map[string]string{
"key1": "value1",
}
foo["key1"] = "new_value1"
foo["key2"] = "value2"
fmt.Printf("%v", foo)
}
查找
map[key]
会返回两个值:取到的值和是否取到值,如果没有取到值会返回相应值的空值
func find() {
foo := map[string]string {
"key1": "value1",
}
key := "key1"
value, get := foo[key]
if get {
fmt.Printf("%v", value)
} else {
fmt.Printf("cannot find key: %v
value is '%v', type is %T", key, value, value)
}
}
遍历
func main() {
foo := map[string]string {
"key1": "value1",
"key2": "value2",
}
for k, v := range foo {
fmt.Printf("key: %v,
value: %v
", k, v)
}
}
delete
func delete(m map[Type]Type1, key Type)