map
Map 是一种无序的键值对的集合。
- 无序 :map[key],不可能使用 map[0] map[1]1去取出数据
- 键值对:key - value /key - value key - value key - value
Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。
Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。
不过,Map 是无序的,我们无法决定它的返回顺序。
Map也是引用类型
【1】、map的定义
package mainimport ("fmt"
)func main() {// map集合,保存数据的一种结构// 创建一个map map[key]value,定义后默认是空的var map1 map[int]stringif map1 == nil {fmt.Println("map1==null")}// 更多的时候时使用make方法去创建var map2 = make(map[string]string)fmt.Println(map2)// 在创建的时候,添加一些数据 map[string]int{"key":"value"}var map3 = map[string]int{"C": 100, "Go": 10, "java": 60}fmt.Println(map3)fmt.Printf("%T\n", map3)
}
【2】、map的使用
- 创建并初始化map
- map[key] = value 。将vaule赋值给对应的map的key
- 判断key是否存在,value, ok = map[key]
- 删除map中的元素, delete(map,key)
- 新增 map[key] = value
- 修改 map[key] = value ,如果存在这个key就是修改。
- 查看map的大小, len(map)
package mainimport ("fmt"
)func main() {// map定义var map1 map[string]int// map1初始化map1 = make(map[string]int)// 在map中,如果key重复了,那么后面的key就会覆盖前面的keymap1["C"] = 100map1["Go"] = 100map1["Java"] = 200fmt.Println(map1)fmt.Println(map1["C"])// 在map中没有index的概念,因此我们需要判断key是否存在// map中的判断,ok-idiom 是否存在 是一个bool值value, ok := map1["C"]if ok {fmt.Println("map中key存在,value", value)} else {fmt.Println("map中key不存在")}// 修改数据map1["C"] = 300fmt.Println(map1)// 如果key存在 那就是直接修改,如果key不存在就是新增的过程map1["C++"] = 400fmt.Println(map1)// 删除数据,delete方法delete(map1, "C")fmt.Println(map1)fmt.Println(len(map1)) // 有几个key len就是多少
}
【3】、map遍历
for k, v := range map1 , key-value,每次打印可能是无序的。
package mainimport "fmt"/*遍历map- key、value 无序的,遍历map,可能每次的结果排序都不一致。- "aaa" "aaaaa"- "bbb" "bbbbb"- "ccc" "ccccc"1、map是无序的,每次打印出来的map可能都不一样,它不能通过index获取,只能通过key来获取
2、map的长度是不固定的,是引用类型的
3、len可以用于map查看map中数据的数量,但是cap无法使用
4、map的key 可以是 布尔类型,整数,浮点数,字符串
*/
func main() {var map1 = map[string]int{"C": 100, "java": 200, "Go": 300}for k, v := range map1 {fmt.Println(k, v)}
}
【4】、map结合slice使用
package mainimport "fmt"func main() {// map 结合 slice 来使用/*需求:1、创建map来存储人的信息,name,age,sex,addr2、每个map保存一个的信息3、将这些map存入到切片中4、打印这些数据*/user1 := make(map[string]string)user1["name"] = "tom"user1["age"] = "14"user1["addr"] = "tianjin"user2 := make(map[string]string)user2["name"] = "jim"user2["age"] = "16"user2["addr"] = "shanghai"user3 := map[string]string{"name": "jerry", "age": "55", "addr": "hangzhou"}fmt.Println(user3)userDate := make([]map[string]string, 0, 3)userDate = append(userDate, user1, user2, user3)fmt.Println(userDate)for _, v := range userDate {fmt.Println(v["name"])}
}
// 通过map和slice 写一个简单的图书数据库,并可以通过书名或者书号来查询书的位置
package mainimport "fmt"func main() {map1 := make(map[string]any)map1["name"] = "haha"map1["num"] = "1212"map1["addr"] = "1-1-3232"map2 := make(map[string]any)map2["name"] = "xixi"map2["num"] = "456"map2["addr"] = "1-2-5252"map3 := make(map[string]any)map3["name"] = "hehe"map3["num"] = "44512"map3["addr"] = "4-1-3232"s1 := make([]map[string]any, 0, 10)s1 = append(s1, map1, map2, map3)fmt.Println(s1)var name stringfmt.Println("请输入书名")fmt.Scan(&name)for _, books := range s1 {if name == books["name"] {fmt.Println(books["addr"])}}
}