Go map使用细节及综合案例

    技术2022-07-11  98

    map 使用细节

    map 是引用类型,遵守引用类型传递的机制,在一个函数接收 map,修改后,会直接修改原来的 map func modify(map1 map[int]int) { map1[10] = 900 } func main() { //map是引用类型,遵守引用类型传递的机制,在一个函数接收map, //修改后,会直接修改原来的map map1 := make(map[int]int) map1[1] = 90 map1[2] = 88 map1[10] = 1 map1[20] = 2 modify(map1) fmt.Println(map1) } 输出结果:

    结果 map1[10] = 900 ,说明map是引用类型
    map 的容量达到后,再想 map 增加元素,会自动扩容,并不会发生 panic,也就是说 map 能动态的增长 键值对(key-value) map1 := make(map[int]int, 2) map1[1] = 90 map1[2] = 88 map1[10] = 1 map1[20] = 2
    map 的 value 也经常使用 struct 类型,更适合管理复杂的数据(比前面 value 是一个 map 更好),比如 value 为 Student 结构体 1.map 的 key 为 学生的学号,是唯一的 2.map 的 value为结构体,包含学生的 名字,年龄, 地址 //定义一个学生结构体 type Stu struct { Name string Age int Address string } func main(){ students := make(map[string]Stu, 10) //创建2个学生 stu1 := Stu{"tom", 18, "北京"} stu2 := Stu{"mary", 28, "上海"} students["no1"] = stu1 students["no2"] = stu2 fmt.Println(students) //遍历各个学生信息 for k, v := range students { fmt.Printf("学生的编号是%v \n", k) fmt.Printf("学生的名字是%v \n", v.Name) fmt.Printf("学生的年龄是%v \n", v.Age) fmt.Printf("学生的地址是%v \n", v.Address) fmt.Println() } } 输出结果:


    综合案例

    案例演示 使用 map[string]map[string]sting 的 map 类型 key: 表示用户名,是唯一的,不可以重复 如果某个用户名存在,就将其密码修改"888888",如果不存在就增加这个用户信息,(包括昵称nickname 和密码 pwd)。 编写一个函数 modifyUser(users map[string]map[string]sting, name string) 完成上述功能 func modifyUser(users map[string]map[string]string, name string) { //判断users中是否有name //v , ok := users[name] if users[name] != nil { //有这个用户 users[name]["pwd"] = "888888" } else { //没有这个用户 users[name] = make(map[string]string, 2) users[name]["pwd"] = "888888" users[name]["nickname"] = "昵称~" + name //示意 } } func main() { users := make(map[string]map[string]string, 10) users["smith"] = make(map[string]string, 2) users["smith"]["pwd"] = "999999" users["smith"]["nickname"] = "小花猫" modifyUser(users, "tom") modifyUser(users, "mary") modifyUser(users, "smith") fmt.Println(users) } 输出结果:

    Processed: 0.013, SQL: 9