Map笔记

127 阅读2分钟

Map(Map并不是线程安全的)

如果要线程安全的map则使用

syncMap sync.Map

1.Map的定义和初始化(必须要初始化才能使用!与slice不同)

//map是一个key(索引)和value(值)的无序集合,主要是查询方便 o(1)
	var courseMap = map[string]string{
		"go":   "go工程师",
		"grpc": "grpc入门",
		"gin":  "gin深入理解",
	}

2.Map的取值和放值

	//取值
	fmt.Println(courseMap["grpc"])
	//放值
	courseMap["mysql"] = "mysql的原理"
	fmt.Println(courseMap)

(1.如果不初始化,则无法给map设置值

var courseMap=map[string]string //nil,map类型想要设值的时候必须要先初始化。
	courseMap["mysql"] = "mysql的原理"
	fmt.Println(courseMap)

会提示此时map为nil

(2.可以给map初始化为空(非nil)

(1).第一种初始化方法

	var courseMap = map[string]string{}
	//nil,map类型想要设值的时候必须要先初始化。
	courseMap["mysql"] = "mysql的原理"
	fmt.Println(courseMap)

此时加上{}后,map则为空初始化便可以正常设值进入。

(2).第二种初始化方法(比较常用)

var courseMap1 = make(map[string]string, 3) 
//make是内置函数,主要用于初始化slice,map,channel

3.Map的遍历(无序打印,不能保证每次打印都为相同顺序)

如果想要完成顺序或者有序打印可以结合slice和map一起使用

(1.key和value都打印

//Map的遍历
	for key, value := range courseMap {
		fmt.Println(key,value)
	}

(2.只打印value用“_”隐藏数据类型代替key

//Map的遍历
	for _, value := range courseMap {
		fmt.Println(value)
	}

(3.只通过key打印

//Map的遍历
	for key := range courseMap {
		fmt.Println(key,courseMap[key])
	}

4.判断Map中是否存在元素

(1.通过if语句判断该Map中是否还有java这个key,如果有则打印key的value

d, ok := courseMap["java"]
	if !ok {
		fmt.Println("not in")
	} else {
		fmt.Println("find", d)
	}
//缩写过后
if d, ok := courseMap["java"];!ok{
		fmt.Println("not in")
	} else {
		fmt.Println("find", d)
	}
courseMap["java"] = "java工程师"

此时便可以找到key=java,则打印java的value

反之

无法通过以下语句debug判断是否存在key为java

d := courseMap["java"]
	fmt.Println(d)

因为当我们给Map中塞入一个key为java但是value为空的时候会发现与寻找一个不存在的key的debug测试相同,

此时我们就需要通过if语句进行判断

	courseMap["java"] = ""
	d := courseMap["java"]
	fmt.Println(d)

5.删除Map中的元素

	delete(courseMap, "grpc")
	fmt.Println(courseMap)

可以删除不存在的元素,并不会报错