Golang学习笔记_16——Map

Golang学习笔记_13——数组
Golang学习笔记_14——切片
Golang学习笔记_15——range



Map

1. 介绍

在Go语言中,map 是一种内置的数据结构,用于存储键值对(key-value pairs)。map 提供了快速的查找、插入和删除操作,使得它在处理需要快速访问的数据时非常高效。

2. 声明和初始化

// 声明未初始化的map
var myMap map[string]int

// 使用 make 函数初始化
myMap := make(map[string]int)

// 使用字面量初始化
myMap := map[string]int{
    "Alice": 30,
    "Bob":   25,
}

3. 类型

map 的键和值可以是任意类型(除了函数类型、map类型和切片类型的值不能作为键)。

键必须是可比较的(即可以使用 ==!= 操作符比较的类型)。

常见的键类型包括整数、浮点数、字符串、布尔值等

值类型则可以是任意类型

4. 基本操作

4.1 插入更新
myMap["Tom"] = 25
myMap["Bob"] = 100
4.2 访问值
value, exists := myMap["Alice"]
if exists {
    fmt.Println("Alice's age is", value)
} else {
    fmt.Println("Alice's age is not found")
}

输出结果

Alice's age is 30
4.3 删除
delete(myMap, "Bob")
4.4 遍历
for key, value := range myMap {
    fmt.Println(key, value)
}

遍历 map 的顺序是随机的,因为 map 不保证键值对的存储顺序

5. 注意事项

  1. 并发访问
    map 不是并发安全的,即多个协程(goroutine)不能同时读写同一个 map。如果需要在多个协程之间共享 map,应该使用 sync.Map 或通过其他同步机制(如互斥锁)来保护对 map 的访问。
  2. 容量
    map 在Go语言中会自动扩展容量,程序员无需手动管理。然而,这并不意味着可以无限制地向 map 中添加元素,当 map 变得非常大时,性能可能会受到影响。
  3. nil map
    未初始化的 mapnil,对其进行任何操作(如插入、查找、删除)都会导致运行时错误。因此,在使用 map 前必须确保它已被初始化。

6. 示例

func map_demo() {
	// 初始化 map
	myMap := make(map[string]int)

	// 插入键值对
	myMap["Alice"] = 30
	myMap["Bob"] = 25

	// 访问值
	age, exists := myMap["Alice"]
	if exists {
		fmt.Println("Alice's age is", age)
	} else {
		fmt.Println("Alice's age is not found")
	}

	// 更新键值对
	myMap["Alice"] = 31

	// 删除键值对
	delete(myMap, "Bob")

	// 遍历 map
	for key, value := range myMap {
		fmt.Println(key, value)
	}

	// 使用字面量初始化 map
	anotherMap := map[string]string{
		"name": "Charlie",
		"city": "New York",
	}

	// 访问 anotherMap 的值
	fmt.Println("Name:", anotherMap["name"])
	fmt.Println("City:", anotherMap["city"])
}

测试方法

func Test_map_demo(t *testing.T) {
	map_demo()
}

输出结果

=== RUN   Test_map_demo
Alice's age is 30
Alice 31
Name: Charlie
City: New York
--- PASS: Test_map_demo (0.00s)
PASS
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值