编程笔记 Golang基础 024 映射

编程笔记 Golang基础 024 映射

Go语言中的映射(map)是一种关联数组或哈希表数据结构,它存储键值对,其中每个键都是唯一的。在Go中,你可以使用 map[keyType]valueType来声明一个映射。

一、映射

在Go语言中,映射(map)是一种内置的数据结构,它提供了一种关联键值对的方式,允许通过唯一的键(key)来存储和检索对应的值(value)。映射中的键是唯一的,并且用于快速查找相关联的值。这种数据结构常被称为关联数组、哈希表或字典,在其他编程语言中也有类似的概念。

Go语言中的映射定义语法如下:

go 复制代码
map[keyType]ValueType

例如,创建一个存储字符串到整数的映射:

go 复制代码
var m map[string]int

使用映射时需要注意以下几点:

  • 映射在使用前必须初始化(可以通过 make 函数或者直接声明并初始化),否则会引发运行时错误。
  • 映射的键必须是可比较类型,也就是说,它们需要支持相等性判断操作(== 和 !=)。
  • 映射是无序的,因此不能保证迭代顺序的一致性。
  • Go 语言中的映射实现了高效的查找、插入和删除操作,这些操作的时间复杂度通常接近 O(1)。

示例代码:

go 复制代码
// 初始化一个映射
m := make(map[string]int)

// 插入键值对
m["apple"] = 1
m["banana"] = 2

// 根据键查找值
value, ok := m["apple"]
if ok {
    fmt.Println("The value for key 'apple' is", value)
} else {
    fmt.Println("Key 'apple' not found")
}

// 删除键值对
delete(m, "banana")

在这个例子中,"ok"是一个布尔值,表示查找是否成功找到指定的键。如果键存在,则"ok"为true,同时返回相应的值;如果键不存在,则"ok"为false,返回的值为零值。

二、映射的定义与初始化

go 复制代码
// 定义并初始化一个字符串到整数的映射
var numbers map[string]int = map[string]int{"one": 1, "two": 2, "three": 3}

// 或者直接初始化而不声明变量类型
numbers := map[string]int{"one": 1, "two": 2, "three": 3}

// 使用make函数创建一个新的映射(推荐方式)
numbers := make(map[string]int)
numbers["one"] = 1
numbers["two"] = 2
numbers["three"] = 3

三、基本操作

  • 插入和访问元素:
go 复制代码
numbers["four"] = 4 // 插入新的键值对
value, exists := numbers["one"] // 访问元素,exists为bool型,表示键是否存在
if exists {
    fmt.Println("The value of 'one' is", value)
}
  • 删除元素:
go 复制代码
delete(numbers, "two") // 删除键为"two"的键值对
  • 遍历映射:
go 复制代码
for key, value := range numbers {
    fmt.Printf("Key: %s, Value: %d\n", key, value)
}

四、综合示例程序

下面是一个综合应用的示例程序,该程序创建了一个学生姓名到分数的映射,并实现了添加、查询、删除和遍历操作:

go 复制代码
package main

import (
	"fmt"
)

func main() {
	// 初始化一个映射
	scores := make(map[string]int)

	// 添加一些学生的分数
	scores["Alice"] = 95
	scores["Bob"] = 85
	scores["Charlie"] = 90

	// 查询并打印某个学生的分数
	if score, ok := scores["Alice"]; ok {
		fmt.Printf("Alice's score is %d.\n", score)
	} else {
		fmt.Println("Alice is not in the records.")
	}

	// 更新一个学生的分数
	scores["Bob"] = 90

	// 删除一个学生记录
	delete(scores, "Charlie")

	// 遍历并打印所有学生的分数
	fmt.Println("All students' scores:")
	for name, score := range scores {
		fmt.Printf("%s: %d\n", name, score)
	}
}

在这个示例中,我们首先创建了一个名为scores的映射,用于存储学生姓名及其对应的分数。然后演示了如何向映射中插入数据、通过键查询值、更新现有键的值以及删除键值对。最后,通过range关键字遍历映射并打印所有的学生分数。

相关推荐
专注VB编程开发20年25 分钟前
各版本操作系统对.NET支持情况(250707更新)
开发语言·前端·ide·vscode·.net
我喜欢就喜欢33 分钟前
RapidFuzz-CPP:高效字符串相似度计算的C++利器
开发语言·c++
莫彩36 分钟前
【Modern C++ Part7】_创建对象时使用()和{}的区别
开发语言·c++
星光542241 分钟前
飞算JavaAI:给Java开发装上“智能引擎”的超级助手
java·开发语言
June bug1 小时前
【Python基础】变量、运算与内存管理全解析
开发语言·python·职场和发展·测试
醇醛酸醚酮酯1 小时前
Qt项目锻炼——TODO(五)
开发语言·qt
蹦蹦跳跳真可爱5891 小时前
Python----OpenCV(几何变换--图像平移、图像旋转、放射变换、图像缩放、透视变换)
开发语言·人工智能·python·opencv·计算机视觉
骁的小小站2 小时前
HDLBits刷题笔记和一些拓展知识(十一)
开发语言·经验分享·笔记·其他·fpga开发
Jtti2 小时前
如何准确查看服务器网络的利用率?
开发语言·php
人生在勤,不索何获-白大侠2 小时前
day17——Java集合进阶(Collections、Map)
java·开发语言