golang_map详解
摘要:
这篇文章主要讲解了Golang中的map数据结构: 它是无序的 key-value 数据存储方式,使用前必须初始化。文中通过代码展示了map的创建、修改、查询、删除及遍历方法,并分享了一些实用的技巧,比如对key排序、 嵌套map与切片结合的高级用法,适合存储复杂数据结构。简单明了,易上手!(由ChatGPT生成)
map是什么?
map是一种
无序的基于key-value的数据结构,属于引用数据类型,必须初始化后才能使用
map的创建和数据的添加
2.1 通过make进行c初始化
package main
import "fmt"
func main() {
// map[key的数据类型]value的数据类型
// make实现了map数据结构的初始化
var userinfo = make(map[string]string, 2)
fmt.Println(userinfo) // nil
// userinfo新增数据,需要保证数据类型与创建时一致
//userinfo[10] = "101" // 错误,key类型不一致
//userinfo["score"] = 100 // 错误,value类型不一致
userinfo["username"] = "张三"
userinfo["password"] = "123456"
userinfo["age"] = "18"
fmt.Println(userinfo)
}
2.2 直接创建map
package main
import "fmt"
func main() {
userinfo := map[string]string{
"username": "张三",
"password": "123456",
// 这里需要注意,即便是最后一个元素,也要添加英文`,`,否则会引发异常
}
fmt.Println(userinfo)
}
修改map中的数据
package main
import "fmt"
func main() {
userinfo := map[string]string{
"username": "张三",
"password": "123456",
// 这里需要注意,即便是最后一个元素,也要添加英文`,`,否则会引发异常
}
fmt.Println(userinfo)
// [] 中的key已经存在则修改这个key对应的数据
userinfo["username"] = "李四"
fmt.Println(userinfo)
// [] 中的key不存在则意味着新增一条key-value数据
userinfo["sex"] = "男"
fmt.Println(userinfo)
}
获取、查询map中的数据
package main
import "fmt"
func main() {
userinfo := map[string]string{
"username": "张三",
"password": "123456",
// 这里需要注意,即便是最后一个元素,也要添加英文`,`,否则会引发异常
}
// v代表查询到key对应的值, ok代表是否找到这个key
v, ok := userinfo["username"]
fmt.Println(v, ok) // 张三 true
v1, o1 := userinfo["age"]
fmt.Println(v1, o1) // nil false
}
删除map中的某个key和其对应的数据
想要删除map中的某个key,需要使用到内置的delete函数,函数用法如下:
delete(map对象, key)
package main
import "fmt"
func main() {
userinfo := map[string]string{
"username": "张三",
"password": "123456",
// 这里需要注意,即便是最后一个元素,也要添加英文`,`,否则会引发异常
}
fmt.Println(userinfo)
delete(userinfo, "username")
fmt.Println(userinfo)
// 如果要删除的key不存在,也不会报错,只是没有任何作用
delete(userinfo, "age")
fmt.Println(userinfo)
}
遍历map中的数据
遍历map类型的数据,可以通过for .. range进行遍历,与遍历切片不同的是key不再是索引,而是map类型中的key值。
package main
import "fmt"
func main() {
userinfo := map[string]string{
"username": "张三",
"password": "123456",
// 这里需要注意,即便是最后一个元素,也要添加英文`,`,否则会引发异常
}
for key, value := range userinfo {
fmt.Println("key:", key, "value:", value)
}
}
一般情况下,在遍历map类型的数据时,不会用_来忽视key的值
6.1 对key进行排序,遍历map
package main
import (
"fmt"
"sort"
)
func main() {
userinfo := map[string]string{
"a": "1",
"b": "2",
"d": "4",
"e": "5",
"c": "3",
// 这里需要注意,即便是最后一个元素,也要添加英文`,`,否则会引发异常
}
// 此时打印的内容时无序的
for key, value := range userinfo {
fmt.Println("key:", key, "value:", value)
}
fmt.Println("----------------------------")
var keys = make([]string, 0)
for key, _ := range userinfo {
keys = append(keys, key)
}
sort.Strings(keys)
for _, v := range keys {
fmt.Println("key:", v, "value:", userinfo[v])
}
}
元素为map类型的切片
在某些情况下,我们可以需要存储许多用户的个人信息,这个时候就需要用到元素为map类型的切片了,map用来存储一个用户的信息,切片用来保存不同的用户。
package main
import "fmt"
func main() {
userinfo := []map[string]string{
map[string]string{
"username": "张三",
"password": "123456",
},
map[string]string{
"username": "李四",
"password": "456789",
},
}
fmt.Println(userinfo)
fmt.Println(userinfo[0])
fmt.Println(userinfo[0]["username"])
fmt.Println("----------------------------")
var user1 = make([]map[string]string, 3)
user1[0] = map[string]string{
"username": "张三",
"password": "123456",
}
fmt.Println(user1)
fmt.Println(user1[0])
fmt.Println(user1[1])
fmt.Println(user1[1] == nil)
}
值为切片类型的map
例如当我们存储某个人的历史工作记录的时候,由于一个用户可能不止从事过一份工作,这个时候就需要用到值为切片的map了。
package main
import "fmt"
func main() {
user := map[string][]string{
"works": {"销售", "程序员", "土木工程"},
}
fmt.Println(user)
// []string : 存储字符串的切片
var u1 = make(map[string][]string)
fmt.Println(u1)
u1["works"] = []string{"程序员", "工程师"}
fmt.Println(u1)
}