【go】map基础操作

Go语言中的map是一种无序的键值对集合,也被称为哈希表或字典,它使用哈希算法实现,可以高效地进行插入、查找和删除操作。以下是Go语言中map的主要用法及注意事项:


一、声明和初始化

  1. 声明map
    使用map[KeyType]ValueType形式声明map,其中KeyType是键的类型,ValueType是值的类型。例如:

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

    此时m为nil,必须初始化后才能使用。

  2. 初始化map

    • 使用make函数初始化:

      go 复制代码
      m := make(map[string]int)
    • 或直接赋值初始化:

      go 复制代码
      m := map[string]int{"one": 1, "two": 2}

    初始化后,map才能进行键值对操作。


二、基本操作

  1. 添加或修改键值对
    直接通过键赋值即可,若键不存在则添加,若键存在则更新值:

    go 复制代码
    m["three"] = 3
  2. 获取值
    通过键获取值,并返回一个布尔值表示键是否存在:

    go 复制代码
    value, ok := m["one"]
    if ok {
        fmt.Println("Value:", value)
    }
  3. 删除键值对
    使用delete函数删除指定键:

    go 复制代码
    delete(m, "two")
  4. 遍历map
    使用for range遍历map,注意遍历顺序是无序的:

    go 复制代码
    for key, value := range m {
        fmt.Println(key, value)
    }

三、注意事项

  1. 键的类型限制
    map的键必须是可比较的类型(如int、string等),不能为切片、map或函数等引用类型,否则编译会报错。
  2. 无序性
    map是无序的,每次遍历的顺序可能不同。如果需要有序遍历,需手动对键排序。
  3. 引用类型
    map是引用类型,赋值或作为函数参数传递时,操作的是同一个底层数据结构。
  4. 并发安全
    Go的map不是并发安全的,若需在多个goroutine中操作,需加锁或使用sync.Map。

四、示例代码

go 复制代码
package main
import "fmt"
func main() {
    // 初始化map
    m := make(map[string]int)
    m["one"] = 1
    m["two"] = 2
    // 遍历map
    for key, value := range m {
        fmt.Println(key, value)
    }
    // 删除键值对
    delete(m, "two")
    // 检查键是否存在
    if value, ok := m["one"]; ok {
        fmt.Println("Value of 'one':", value)
    }
}

五、总结

Go语言的map是一种高效的键值对存储结构,适用于需要快速查找、插入和删除的场景。使用时需注意键的类型限制、无序性以及并发安全问题。通过合理声明、初始化和操作,可以充分发挥map的优势。

实战应用:排序

在Go语言中,map本身是无序的,无法直接对键值对进行排序。但可以通过将map的键或值提取到切片中,对切片进行排序,再按排序后的顺序遍历map,从而实现有序输出。

一、排序的基本步骤

  1. 提取键或值到切片
    将map的键或值存储到一个切片中,以便后续排序操作。
  2. 对切片排序
    使用sort包对切片进行排序。例如,按键排序时,可对键切片调用sort.Strings()或sort.Ints()等函数。
  3. 按排序后的顺序遍历map
    遍历排序后的切片,通过切片中的键或值访问map,从而实现有序输出。

二、示例代码

以下是一个按键排序的示例代码:

go 复制代码
package main
import (
	"fmt"
	"sort"
)
func main() {
	// 初始化map
	m := map[string]int{"banana": 2, "apple": 1, "orange": 3}
	// 提取键到切片
	keys := make([]string, 0, len(m))
	for key := range m {
		keys = append(keys, key)
	}
	// 对键切片排序
	sort.Strings(keys)
	// 按排序后的键遍历map
	for _, key := range keys {
		fmt.Printf("%s: %d\n", key, m[key])
	}
}

运行结果可能如下:

复制代码
apple: 1
banana: 2
orange: 3

三、注意事项

  1. 无序性
    Go语言的map默认是无序的,每次遍历map时输出的顺序可能不同。
  2. 排序范围
    排序操作仅针对切片,map本身不会被修改。排序后的顺序仅用于遍历输出。
  3. 按值排序
    如果需要按值排序,可以将键值对存储为结构体切片,并对结构体切片进行排序。
    通过以上方法,可以灵活实现对map键值对的排序需求。
相关推荐
考虑考虑33 分钟前
瀚高数据库
数据库·后端·postgresql
晗夜未央37 分钟前
任务队列反复失败,先分清重试、阻塞和结果待核对
开发语言·javascript
熊猫钓鱼>_>40 分钟前
四种书签,一条时间线:一个读书 App 的记忆颗粒与它的边界案例【鸿蒙心迹】
开发语言·华为·ai编程·harmonyos·鸿蒙·openharmony·鸿蒙pc
锋行天下1 小时前
DeepSeek写Langgraph就是个大傻逼,一本正经胡说八道
前端·人工智能·后端
努力努力再努力wz1 小时前
【Lua 入门系列】Lua 函数深入理解:函数对象、多返回值、可变参数、闭包、递归与尾调用优化
开发语言·lua
飞浪纪元[FWC–FE]2 小时前
从零到一键绿:Qt 5.14.2 + VS2019 开发环境搭建、Kit 套件配置与构建错误修复完全手册
开发语言·qt
Wang's Blog2 小时前
Java 项目实战:交友项目 - 联系人列表
java·开发语言·交友
我命由我123452 小时前
访客系统形式(有用户概念、无用户概念)
java·开发语言·前端·javascript·python·产品运营·产品经理
架构师伯子明2 小时前
FFmpeg C++学习(一):编译和demo
开发语言·c++·学习
海域云SeaArea_2 小时前
Windows Server 2008 R2 从零安装 IIS7.5(二):php.ini 配置
开发语言·windows·php