Go的Map

发布于 2023-10-11  250 次阅读


目标:什么是map?

什么是Map

Map 是一种无序的键值对的集合。

Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。

Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,遍历 Map 时返回的键值对的顺序是不确定的。

在获取 Map 的值时,如果键不存在,返回该类型的零值,例如 int 类型的零值是 0,string 类型的零值是 ""。

Map 是引用类型,如果将一个 Map 传递给一个函数或赋值给另一个变量,它们都指向同一个底层数据结构,因此对 Map 的修改会影响到所有引用它的变量。

!!!单纯的Map不是线程安全的,如果需要使用线程安全的使用(sync.map()方法)

示例1

 // 案例
package main

import "fmt"

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

	// 取值
	fmt.Println(courseMap["grpc"]) // grpc入门

	// 入值
	courseMap["mysql"] = "mysql原理"
	fmt.Println(courseMap) // map[gin:gin深入理解 go:go工程师 grpc:grpc入门 mysql:mysql原理]

	// 错误展示(当设置了一个Map但是没有初始化,系统就会报错)
	//var courseMap2 map[string]string
	//courseMap2["mysql"] = "mysql原理"
	//fmt.Println(courseMap2) // 输出结果:panic: assignment to entry in nil map

	// 2.make方法初始化(更为常用)
	var courseMap3 = make(map[string]string, 10)
	courseMap3["study"] = "学习Go语言"
	fmt.Println(courseMap3) // map[study:学习Go语言]
}

Map循环

 // 案例
package main

import "fmt"

func main() {
        var courseMap = map[string]string{
		"go":   "go工程师",
		"grpc": "grpc入门",
		"gin":  "gin深入理解",
	}

        // map 循环是无序的
	for key, value := range courseMap {
		fmt.Println(key, value)
	}
	fmt.Println("-----------")

	for _, value := range courseMap {
		fmt.Println(value)
	}
	fmt.Println("-----------")

	for key := range courseMap {
		fmt.Println(key, courseMap[key])
	}
}

Map判断元素是否存在

 // 案例
package main

import "fmt"

func main() {
        var courseMap = map[string]string{
		"go":   "go工程师",
		"grpc": "grpc入门",
		"gin":  "gin深入理解",
	}

        // 判断一个map里面是否存在该参数
	courseMap["java"] = ""
	d, ok := courseMap["java"]
	if !ok {
		fmt.Println("not ok")
	} else {
		fmt.Println("is set", d)
	}

	// 写法2
	if d, ok := courseMap["java"]; !ok {
		fmt.Println("not ok")
	} else {
		fmt.Println("is set", d)
	}
// 运行结果:is set
}

Map删除

 // 案例
package main

import "fmt"

func main() {
        var courseMap = map[string]string{
		"go":   "go工程师",
		"grpc": "grpc入门",
		"gin":  "gin深入理解",
	}
	delete(courseMap, "grpc")
	delete(courseMap, "aaa") // 删除一个不存在的键值,不会报错
	fmt.Println(courseMap)   // 运行结果:map[gin:gin深入理解 go:go工程师 java: mysql:mysql原理] 
}
届ける言葉を今は育ててる
最后更新于 2023-10-19