【学习笔记】golang_map详解

111 阅读4分钟

golang_map详解

摘要:

这篇文章主要讲解了Golang中的map数据结构: 它是无序的 key-value 数据存储方式,使用前必须初始化。文中通过代码展示了map的创建、修改、查询、删除及遍历方法,并分享了一些实用的技巧,比如对key排序、 嵌套map与切片结合的高级用法,适合存储复杂数据结构。简单明了,易上手!(由ChatGPT生成)

map是什么?

map是一种无序的基于key-value的数据结构,属于引用数据类型,必须初始化后才能使用

map的创建和数据的添加

2.1 通过make进行c初始化
package main
import "fmt"
func main() {
	// map[key的数据类型]value的数据类型
	// make实现了map数据结构的初始化
	var userinfo = make(map[string]string, 2)
	fmt.Println(userinfo)  // nil
	// userinfo新增数据,需要保证数据类型与创建时一致
	//userinfo[10] = "101"   // 错误,key类型不一致
	//userinfo["score"] = 100  // 错误,value类型不一致
	userinfo["username"] = "张三"
	userinfo["password"] = "123456"
	userinfo["age"] = "18"
	fmt.Println(userinfo)
}
2.2 直接创建map
package main
import "fmt"
func main() {
	userinfo := map[string]string{
		"username": "张三",
		"password": "123456",
		// 这里需要注意,即便是最后一个元素,也要添加英文`,`,否则会引发异常
	}
	fmt.Println(userinfo)
}

修改map中的数据

package main
import "fmt"
func main() {
	userinfo := map[string]string{
		"username": "张三",
		"password": "123456",
		// 这里需要注意,即便是最后一个元素,也要添加英文`,`,否则会引发异常
	}
	fmt.Println(userinfo)
	// [] 中的key已经存在则修改这个key对应的数据
	userinfo["username"] = "李四"
	fmt.Println(userinfo)
	// [] 中的key不存在则意味着新增一条key-value数据
	userinfo["sex"] = "男"
	fmt.Println(userinfo)
}

获取、查询map中的数据

package main
import "fmt"
func main() {
	userinfo := map[string]string{
		"username": "张三",
		"password": "123456",
		// 这里需要注意,即便是最后一个元素,也要添加英文`,`,否则会引发异常
	}
	// v代表查询到key对应的值, ok代表是否找到这个key
	v, ok := userinfo["username"]
	fmt.Println(v, ok) // 张三 true
	v1, o1 := userinfo["age"]
	fmt.Println(v1, o1) //  nil false
}

删除map中的某个key和其对应的数据

想要删除map中的某个key,需要使用到内置的delete函数,函数用法如下:

delete(map对象, key)

package main
import "fmt"
func main() {
	userinfo := map[string]string{
		"username": "张三",
		"password": "123456",
		// 这里需要注意,即便是最后一个元素,也要添加英文`,`,否则会引发异常
	}
	fmt.Println(userinfo)
	delete(userinfo, "username")
	fmt.Println(userinfo)
	// 如果要删除的key不存在,也不会报错,只是没有任何作用
	delete(userinfo, "age")
	fmt.Println(userinfo)
}

遍历map中的数据

遍历map类型的数据,可以通过for .. range进行遍历,与遍历切片不同的是key不再是索引,而是map类型中的key值。

package main
import "fmt"
func main() {
	userinfo := map[string]string{
		"username": "张三",
		"password": "123456",
		// 这里需要注意,即便是最后一个元素,也要添加英文`,`,否则会引发异常
	}
	for key, value := range userinfo {
		fmt.Println("key:", key, "value:", value)
	}
}

一般情况下,在遍历map类型的数据时,不会用_来忽视key的值

6.1 对key进行排序,遍历map
package main
import (
	"fmt"
	"sort"
)
func main() {
	userinfo := map[string]string{
		"a": "1",
		"b": "2",
		"d": "4",
		"e": "5",
		"c": "3",
		// 这里需要注意,即便是最后一个元素,也要添加英文`,`,否则会引发异常
	}
	// 此时打印的内容时无序的
	for key, value := range userinfo {
		fmt.Println("key:", key, "value:", value)
	}
	fmt.Println("----------------------------")
	var keys = make([]string, 0)
	for key, _ := range userinfo {
		keys = append(keys, key)
	}
	sort.Strings(keys)
	for _, v := range keys {
		fmt.Println("key:", v, "value:", userinfo[v])
	}
}

元素为map类型的切片

在某些情况下,我们可以需要存储许多用户的个人信息,这个时候就需要用到元素为map类型的切片了,map用来存储一个用户的信息,切片用来保存不同的用户

package main
import "fmt"
func main() {
	userinfo := []map[string]string{
		map[string]string{
			"username": "张三",
			"password": "123456",
		},
		map[string]string{
			"username": "李四",
			"password": "456789",
		},
	}
	fmt.Println(userinfo)
	fmt.Println(userinfo[0])
	fmt.Println(userinfo[0]["username"])
	fmt.Println("----------------------------")
	var user1 = make([]map[string]string, 3)
	user1[0] = map[string]string{
		"username": "张三",
		"password": "123456",
	}
	fmt.Println(user1)
	fmt.Println(user1[0])
	fmt.Println(user1[1])
	fmt.Println(user1[1] == nil)
}

值为切片类型的map

例如当我们存储某个人的历史工作记录的时候,由于一个用户可能不止从事过一份工作,这个时候就需要用到值为切片的map了。

package main
import "fmt"
func main() {
	user := map[string][]string{
		"works": {"销售", "程序员", "土木工程"},
	}
	fmt.Println(user)
	// []string : 存储字符串的切片
	var u1 = make(map[string][]string)
	fmt.Println(u1)
	u1["works"] = []string{"程序员", "工程师"}
	fmt.Println(u1)
}