Golang map 字典 映射
优质
小牛编辑
147浏览
2023-12-01
map 翻译过来就是字典或者映射,可以把 map 看做是切片的升级版
- 切片是用来存储一组相同类型的数据的,map也是用来存储一组相同类型的数据的
- 在切片中我们可以通过索引获取对应的元素,在 map 中我们可以通过key获取对应的元素
- 切片的索引是系统自动生成的,从0开始递增,map 中的 key 需要我们自己指定
- 只要是可以做 ==、!= 判断的数据类型都可以作为 key(数值类型、字符串、数组、指针、结构体、接口)
- map的key的数据类型不能是:slice、map、function
- map和切片一样容量都不是固定的,当容量不足时底层会自动扩容
map 格式:var dic map[key数据类型]value数据类型
package main import "fmt" func main() { var dic map[int]int = map[int]int{0:1, 1:3, 2:5} fmt.Println(dic) // map[0:1 1:3 2:5] // 获取map中某个key对应的值 fmt.Println(dic[0]) // 1 // 修改map中某个key对应的值 dic[1] = 666 fmt.Println(dic) // map[0:1 1:666 2:5] }
package main import "fmt" func main() { var dict map[string]string = map[string]string{"name":"lnj", "age":"33", "gender":"male"} fmt.Println(dict)// map[name:lnj age:33 gender:male] }
创建 map 的三种方式
方式一:通过 Go 提供的语法糖快速创建
package main import "fmt" func main() { dict := map[string]string{"name":"lnj", "age":"33", "gender":"male"} fmt.Println(dict)// map[name:lnj age:33 gender:male] }
方式二:通过 make 函数创建 make(类型, 容量)
package main import "fmt" func main() { var dict = make(map[string]string, 3) dict["name"] = "lnj" dict["age"] = "33" dict["gender"] = "male" fmt.Println(dict)// map[age:33 gender:male name:lnj] }
- 和切片一样,没有被创建的 map 是不能使用的
package main import "fmt" func main() { // map声明后不能直接使用, 只有通过make或语法糖创建之后才会开辟空间,才能使用 var dict map[string]string dict["name"] = "lnj" // 编译报错 dict["age"] = "33" dict["gender"] = "male" fmt.Println(dict) }
map 的增删改查
增加:当 map 中没有指定的 key 时就会自动增加
package main import "fmt" func main() { var dict = make(map[string]string) fmt.Println("增加前:", dict) // map[] dict["name"] = "lnj" fmt.Println("增加后:", dict) // map[name:lnj] }
修改:当 map 中有指定的 key 时就会自动修改
package main import "fmt" func main() { var dict = map[string]string{"name":"lnj", "age":"33", "gender":"male"} fmt.Println("修改前:", dict) // map[name:lnj age:33 gender:male] dict["name"] = "zs" fmt.Println("修改后:", dict) // map[age:33 gender:male name:zs] }
删除:可以通过 Go 语言内置 delete 函数删除指定元素
package main import "fmt" func main() { var dict = map[string]string{"name":"lnj", "age":"33", "gender":"male"} fmt.Println("删除前:", dict) // map[name:lnj age:33 gender:male] // 第一个参数: 被操作的字典 // 第二个参数: 需要删除元素对应的key delete(dict, "name") fmt.Println("删除后:", dict) // map[age:33 gender:male] }
查询:通过 ok-idiom 模式判断指定键值对是否存储
package main import "fmt" func main() { var dict = map[string]string{"name":"lnj", "age":"33", "gender":"male"} //value, ok := dict["age"] //if(ok){ // fmt.Println("有age这个key,值为", value) //}else{ // fmt.Println("没有age这个key,值为", value) //} if value, ok := dict["age"]; ok{ fmt.Println("有age这个key,值为", value) } }
map 遍历
注意:map 和数组以及切片不同,map 中存储的数据是无序的,所以多次打印输出的顺序可能不同
var dict = map[string]string{"name":"lnj", "age":"33", "gender":"male"} for key, value := range dict{ fmt.Println(key, value) }