Go基础:011.Map

88 阅读3分钟

概述

Map 是一种无序的键值对的集合。通过 key 来快速检索数据,key 类似于索引,指向数据的值。

定义Map

如果不初始化 map,那么就会创建一个 nil map。nil map 不能用来存放键值对。

package main

import "fmt"

func main() {
	//1. var创建map,默认是nil(没有盘子)
	var map1 map[int]string //没有初始化,是nil map
	fmt.Println(map1) //map[]
	fmt.Println(map1 == nil) //true

	//2. 使用make函数创建,常用的(有盘子)
	var map2 = make(map[int]string)
	fmt.Println(map2) //map[]
	fmt.Println(map2 == nil) //false

	//3. 使用map关键字创建并赋值(有盘子有饺子)
	var map3 = map[int]string{1: "hello", 2: "world"}
	fmt.Println(map3) //map[1:hello 2:world]
	fmt.Println(map3 == nil) //false

	//4. nil map不能用来存放键值对
	//map1[1] = "hello" //panic: assignment to entry in nil map

	map2[1] = "hello"
	fmt.Println(map2) //map[1:hello]

	if map1 == nil {
		map1 = make(map[int]string)
		fmt.Println(map1 == nil) //false
	}
}

delete() 函数

delete() 函数用于删除集合的元素, 参数为 map 和其对应的 key。

package main

import "fmt"

func main() {
	//1. 定义map
	p1 := map[string]string{
		"name":    "jim",
		"age":     "30",
		"address": "beijing",
	}

	fmt.Println("删除前:", p1)

	//2. 删除某个key
	delete(p1, "name")

	fmt.Println("删除后:", p1)

	//3. 删除不存在的key,无影响
	delete(p1, "hello")
	fmt.Println("删除不存在的key后:", p1)

	/*
	删除前: map[address:beijing age:30 name:jim]
	删除后: map[address:beijing age:30]
	删除不存在的key后: map[address:beijing age:30]
	*/
}

赋值 & 取值 & 判断值是否存在

package main

import "fmt"

func main() {
	//1. make函数创建map
	var m1 = make(map[int]string)

	//2. 为map赋值
	m1[1] = "Go"
	m1[2] = "Java"
	m1[3] = "Python"
	m1[4] = "JavaScript"
	m1[5] = ""

	//3. map取值
	fmt.Println(m1)
	fmt.Println("m1[4]:", m1[4])   //访问map中的值
	fmt.Println("m1[5]:", m1[5])   //m1[5],刚好存的是空字符串
	fmt.Println("m1[40]:", m1[40]) //访问不存在的key,返回空字符串

	//3. 区分存储的空字符串 和 返回的空字符串
	value1, ok := m1[5]
	if ok {
		fmt.Println("m1[5]中有值:", value1)
	} else {
		fmt.Println("m1[5]中无值。")
	}
	value2, ok := m1[40]
	if ok {
		fmt.Println("m1[40]中有值:", value2)
	} else {
		fmt.Println("m1[40]中无值。")
	}

	//4. map修改,key存在就是修改,不存在就是添加
	fmt.Println("修改前:", m1)
	m1[1] = "GoGo"
	fmt.Println("修改后:", m1)

	//5. map长度
	fmt.Println("m1的长度:", len(m1))

	/*
		map[1:Go 2:Java 3:Python 4:JavaScript 5:]
		m1[4]: JavaScript
		m1[5]:
		m1[40]:
		m1[5]中有值:
		m1[40]中无值。
		修改前: map[1:Go 2:Java 3:Python 4:JavaScript 5:]
		修改后: map[1:GoGo 2:Java 3:Python 4:JavaScript 5:]
		m1的长度: 4
	*/
}

遍历

package main

import "fmt"
import "sort"

func main() {
	m1 := map[string]string{"name": "Jack", "age": "24", "sex": "Male", "address": "Shanghai"}

	for key,_ := range m1 {
		// 1. map的顺序不固定,每次输出可能都不一致
		fmt.Printf(m1[key] + ";")
	}
	fmt.Println("")

	// 如何按固定顺序遍历map呢?

	// 1. 将map的key存储到切片中
	keys := make([]string, 0, len(m1))
	for key, _ := range m1 {
		keys = append(keys, key)
	}
	fmt.Println(keys)

	// 2. 对keys进行排序
	sort.Strings(keys)

	// // 3. 按排序的keys来遍历map
	for _, key := range keys {
		fmt.Printf(m1[key]+";")
	}
	fmt.Println("")
}