GO学习之 Map 操作

GO系列

1、GO学习之Hello World
2、GO学习之入门语法
3、GO学习之切片操作
4、GO学习之 Map 操作
5、GO学习之 结构体 操作
6、GO学习之 通道(Channel)
7、GO学习之 多线程(goroutine)
8、GO学习之 函数(Function)
9、GO学习之 接口(Interface)

前言

按照公司目前的任务,go 学习是必经之路了,虽然行业卷,不过技多不压身,依旧努力!!!
前面学习了切片操作,对切片有了基本的认识,还有一些基础操作的认识,发现还是和 JAVA 的 List操作有很大区别,今天来认识一下Map以及如何操作的。

一、什么是Map

首先,什么是 Map 呢?就是一种无序的以 key-value 键值对方式存储的数据结构,在 Go 语言中,Map也一样,类似于哈希或者字典,是引用类型,所以必须初始化才能使用,适用于快速查找和存储键值对的场景。
Map 是一种引用类型,需要 make() 函数来创建, 这样来定义 map[键类型]值类型,例如 map[string]int 表示键为字符串类型,值为整数类型的 map。

  • 创建一个空的 map: myMap := make(map[string]int)
  • 使用 map 的名称来添加或修改对于的值,myMap[“a”] = “100”
  • 使用 map 的名称来获取对应的值,value := myMap[“a”]
  • 使用 delete() 函数来删除 map 中的键值对, delete(myMap, “a”)
  • 使用 “for range” 来循环遍历 map 中的键值对, for key, value := range myMap{}
  • 使用 len() 函数获取 map 中键值对的数量, length := len(myMap),需要注意的是,map 中键必须是支持相等操作的类型,比如 整数、字符串、浮点数、指针、数组、结构体等,而值可以是任何类型;另外 map 是无须的结构,遍历 map 的顺序是不确定的。

二、Map的基本操作

2.1 定义map

下面的示例中,定义了一个 map 类型的变量 myMap,从运行结果可以看出,定义的 map 是空的。
可以在什么的时候指定容量,这样就不会导致容量不够扩容而消耗性能了。
也可以在声明的时候初始化值,有时候在开发中需要定义一个字段来使用。

package main

import "fmt"

func main() {
    
    
	// 定义一个空的map
	emptyMap := make(map[string]int)
	// 可以指定map的容量,也可以不指定
	myMap := make(map[string]int, 8)
	// 往 myMap 中添加值
	myMap["a"] = 1
	myMap["b"] = 2
	myMap["c"] = 3
	fmt.Println(myMap)
	// 声明的时候添加元素
	dictMap := map[string]string{
    
    
		"001": "男",
		"002": "女",
		"003": "未知",
	}
	fmt.Println(dictMap)
}

运行结果:

PS D:\workspaceGo> go run map.go
map[]
map[a:1 b:2 c:3]
map[001:男 002:女 003:未知]

2.2 添加和修改键值对

package main

import "fmt"

func main() {
    
    
	myMap := make(map[string]int)
	// 往 myMap 中添加值
	myMap["a"] = 1
	myMap["b"] = 2
	myMap["c"] = 3
	myMap["d"] = 4
	myMap["e"] = 5
	fmt.Println("修改后的map: ", myMap)
	// 修改 map 中的值
	myMap["e"] = 500
	fmt.Println("修改后的map: ", myMap)
}

运行结果:

PS D:\workspaceGo> go run map.go
修改后的map:  map[a:1 b:2 c:3 d:4 e:5]
修改后的map:  map[a:1 b:2 c:3 d:4 e:500]

2.3 删除键值对

package main

import "fmt"

func main() {
    
    
	myMap := make(map[string]int)
	// 往 myMap 中添加值
	myMap["a"] = 1
	myMap["b"] = 2
	myMap["c"] = 3
	myMap["d"] = 4
	myMap["e"] = 5
	fmt.Println("删除后的map: ", myMap)
	// 删除 map 中的值
	delete(myMap, "a")
	delete(myMap, "e")
	fmt.Println("删除后的map: ", myMap)
}

运行结果:

PS D:\workspaceGo> go run map.go
删除后的map:  map[a:1 b:2 c:3 d:4 e:5]
删除后的map:  map[b:2 c:3 d:4]

2.4 遍历键值对

  • 基本的遍历
package main

import "fmt"

func main() {
    
    
	myMap := make(map[string]int)
	// 往 myMap 中添加值
	myMap["a"] = 1
	myMap["b"] = 2
	myMap["c"] = 3
	myMap["d"] = 4
	myMap["e"] = 5
	length := len(myMap)
	fmt.Println("map的长度:", length)
	// 遍历 map
	for key, value := range myMap {
    
    
		fmt.Println("key: ", key, ", value: ", value)
	}
}

运行结果:

PS D:\workspaceGo> go run map.go
map的长度: 5
key:  a , value:  1
key:  b , value:  2
key:  c , value:  3
key:  d , value:  4
key:  e , value:  5
PS D:\workspaceGo> go run map.go
map的长度: 5
key:  e , value:  5
key:  a , value:  1
key:  b , value:  2
key:  c , value:  3
key:  d , value:  4

:这里我执行了两次,可以看出两次遍历打印出来的顺序都会不一样的,所以 map 是无须的键值对数据结构。

  • 忽略键或者值的写法
	// 只需要值,不需要 key
	for _, v := range myMap {
    
    
		fmt.Println("值为:", v)
	}
	for k, _ := range myMap {
    
    
		fmt.Println("键为:", k)
	}
  • 顺序遍历 map
    ...声明 myMap 代码省略,同上
	//声明切片用来存放 kay
	keys := []string{
    
    }
	for key := range myMap {
    
    
		keys = append(keys, key)
	}
	//对切片进行排序
	sort.Strings(keys)
	//遍历切片来获取 map 元素
	for _, k := range keys {
    
    
		fmt.Println(k, myMap[k])
	}

运行结果:

a 1
b 2
c 3
d 4
e 5

2.5 判断某个key是否存在

package main

import "fmt"

func main() {
    
    
	myMap := make(map[string]int, 8)
	// 往 myMap 中添加值
	myMap["a"] = 1
	myMap["b"] = 2
	myMap["c"] = 3
	value, ok := myMap["d"]
	if ok {
    
    
		fmt.Println(value)
	} else {
    
    
		fmt.Println("没有这个键")
	}

	v, exists := myMap["a"]
	if exists {
    
    
		fmt.Println("a 的值为:", v)
	} else {
    
    
		fmt.Println("没有a")
	}
}

运行结果:

PS D:\workspaceGo> go run map.go
没有这个键
a 的值为: 1

三、总结

其实 map 还是比较容易上手的,初始化和操作都比较容易的。
我主张每篇博客都不要长篇大论,这样有需要的人也能很容易检索到想要的结果,自己在后面复习巩固的时候也不会看自己的博客疲劳。

猜你喜欢

转载自blog.csdn.net/qq_19283249/article/details/131864539
今日推荐