【Golang】Go语言Map数据类型

发布于:2025-07-30 ⋅ 阅读:(17) ⋅ 点赞:(0)

Go语言Map数据类型

一、Map

  • map是一种无序的基本key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。

1.1.1、map定义

  • Go语言中map的定义语法如下
map[keytype]valuetype
  • 其中
keytype: 表示键的类型
valuetype: 表示值的类型
  • map类型的变量默认初始值为nil,需要使用make()来分配内存。
  • 语法如下
make(map[keytype]valuetype, [cap])
  • 其中cap表示map的容量,该参数虽然不是必须的,但是我们应该在初始化map的时候就为其执行一个合适的容量。

1.1.2、map的基本使用

  • map中的数据都是成对出现的,map的基本使用示例代码如下:
func main() {

	scoreMap := make(map[string]int, 8)
	scoreMap["张三"] = 90
	scoreMap["小明"] = 100
	fmt.Println(scoreMap)
	fmt.Println(scoreMap["小明"])
	fmt.Printf("tyoe of a:%T\n", scoreMap)

}
  • 结果如下
map[小明:100 张三:90]
100
tyoe of a:map[string]int
  • map也支持在声明的时候填充元素,例如
func main() {

	userInfo := map[string]string{
		"username": "admin",
		"password": "admin@123",
	}

	fmt.Println(userInfo)  // map[password:admin@123 username:admin]
	fmt.Println(userInfo["username"])  // admin 
	fmt.Println(userInfo["password"])  // admin@123

}

1.1.3、判断某个键是否存在

  • Go语言中有个判断map中键是否存在的特俗写法,格式如下:
# value: 将会获得这个map的值
# ok: 如果key存在那么ok的值就是true否者为false
value, ok := map[key]
  • 举个例子:
func main() {

	userInfo := map[string]string{
		"username": "admin",
		"password": "admin@123",
	}
	// 如果key存在ok为true, v为对应key的值; 不存在ok为false, v为值类型的零值
	v, ok := userInfo["username"]

	if ok {
		fmt.Println(v)
	} else {
		fmt.Println("查无此人")
	}

}

1.1.4、map的遍历

  • Go语言中使用for range遍历map
func main() {

	scoremap := make(map[string]int)
	scoremap["张三"] = 90
	scoremap["小明"] = 100
	scoremap["王五"] = 60
	for k, v := range scoremap {
		fmt.Printf("key: %s value: %d\n", k, v)
	}

}
  • 但我们只想遍历key的时候,可以按照下面的写法:
func main() {

	scoremap := make(map[string]int)
	scoremap["张三"] = 90
	scoremap["小明"] = 100
	scoremap["王五"] = 60
	for k := range scoremap {
		fmt.Printf(k)
	}

}
  • 注意:遍历map时的元素顺序与添加键值对的顺序毫无关系

1.1.5、使用delete()函数删除键值对

  • 使用delete()内建函数从map中删除一组键值对,delete()函数的格式如下:
delete(map, key)
  • 其中
map: 表示要删除键值对的map
key: 表示要删除的键值对的key
  • 示例代码如下
func main() {

	scoremap := make(map[string]int)
	scoremap["张三"] = 90
	scoremap["小明"] = 100
	scoremap["王五"] = 60
	delete(scoremap, "小明")
	for k, v := range scoremap {
		fmt.Printf(k, v)
	}

}

1.1.6、按照指定顺序遍历map

func main() {
	rand.Seed(time.Now().UnixNano()) // 初始化随机种子

	var scoreMap = make(map[string]int, 200)

	for i := 0; i < 100; i++ {
		key := fmt.Sprintf("stu%02d", i) // 生成stu开发的字符串
		value := rand.Intn(100)          // 生成0-99的随机整数
		scoreMap[key] = value
	}

	// 取出map中的所有key存入切片keys
	var keys = make([]string, 0, 200)
	for key := range scoreMap {
		keys = append(keys, key)
	}

	// 对切片进行排序
	sort.Strings(keys)
	for _, key := range keys {
		fmt.Println(key, scoreMap[key])
	}

}

1.1.7、元素为map类型的切片

  • 下面的代码演示了切片中的元素为map类型时的操作
func main() {
	// 使用make初始化一个map类型的切片
	var mapSlice = make([]map[string]string, 3)
	for index, value := range mapSlice {
		fmt.Printf("index: %d value: %v\n", index, value)
	}
	fmt.Println("init data")
	// 在mapSlice这个切片的第0个位置, 创建一个容量为10的map,并进行赋值
	mapSlice[0] = make(map[string]string, 10)
	mapSlice[0]["name"] = "王五"
	mapSlice[0]["password"] = "123456"
	mapSlice[0]["address"] = "红旗大街"
	for index, value := range mapSlice {
		fmt.Printf("index: %d value: %v\n", index, value)
	}

}

1.1.8、值为切片类型的map

  • 下面的代码演示了map中值为切片类型的操作
func main() {
	var sliceMap = make(map[string][]string, 3)
	fmt.Println(sliceMap)
	fmt.Println("init data")
	key := "中国"
	value, ok := sliceMap[key]
	if !ok {
		value = make([]string, 0, 2)
	}
	value = append(value, "北京", "上海")
	sliceMap[key] = value
	fmt.Println(sliceMap)
}

网站公告

今日签到

点亮在社区的每一天
去签到