map数据类型

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 main

import (
	"fmt"
)

func main() {
	// map集合,保存数据的一种结构
	// 创建一个map  map[key]value,定义后默认是空的
	var map1 map[int]string
	if 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 main

import (
	"fmt"
)

func main() {
	// map定义
	var map1 map[string]int
	// map1初始化
	map1 = make(map[string]int)
	// 在map中,如果key重复了,那么后面的key就会覆盖前面的key
	map1["C"] = 100
	map1["Go"] = 100
	map1["Java"] = 200
	fmt.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"] = 300
	fmt.Println(map1)
	// 如果key存在 那就是直接修改,如果key不存在就是新增的过程
	map1["C++"] = 400
	fmt.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 main

import "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 main

import "fmt"

func main() {
	// map 结合 slice 来使用

	/*
	   需求:
	   1、创建map来存储人的信息,name,age,sex,addr
	   2、每个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 main

import "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 string
	fmt.Println("请输入书名")
	fmt.Scan(&name)
	for _, books := range s1 {
		if name == books["name"] {
			fmt.Println(books["addr"])
		}
	}
}
posted @ 2024-11-13 21:20  Linux小菜鸟  阅读(28)  评论(0编辑  收藏  举报