当前位置: 首页 > news >正文

go语言中数组、map和切片的异同

在Go语言中,数组、切片(slice)和映射(map)是三种常用的数据结构,它们在用途和特性上有显著差异。以下是它们的异同总结:


相同点

  1. 集合类型:三者都用于存储一组数据。

  2. 元素访问:支持通过索引(数组/切片)或键(map)直接访问元素。

  3. 类型安全:元素类型固定(数组和切片元素类型一致,map的键和值类型固定)。

  4. 复合字面量初始化:均可通过字面量语法初始化,例如:

    arr := [3]int{1, 2, 3}        // 数组
    sli := []int{1, 2, 3}         // 切片
    m := map[string]int{"a": 1}   // map

不同点

特性数组(Array)切片(Slice)映射(Map)
类型性质值类型(赋值/传参时复制整个数组)引用类型(底层基于数组,传递时共享数据)引用类型(传递时共享底层哈希表)
长度固定长度,声明时确定(如 [3]int动态长度,可自动扩容(通过 append动态长度,随键值对增减自动扩展
内存分配连续内存块,栈或堆上分配结构体(包含指针、长度、容量),指向底层数组哈希表实现,内存结构较复杂
键/索引类型整数索引(从0开始)整数索引(从0开始)任意可哈希类型(如 intstring, 结构体等)
初始化方式直接声明或字面量(需指定长度)通过 make、切片表达式或字面量(无需长度)必须通过 make 或字面量初始化(否则为 nil
容量管理固定容量有容量(cap)概念,可动态扩容(通常翻倍)无容量概念,自动处理底层存储扩展
性能特点访问速度最快(连续内存,无额外开销)接近数组,但追加/扩容可能触发复制哈希表查询(O(1) 平均复杂度,但存在哈希冲突)
零值所有元素为类型零值(如 [3]int{} → [0,0,0]nil(未初始化,无底层数组)nil(未初始化,无法直接添加键值对)
线程安全非并发安全非并发安全非并发安全
典型用途固定大小的数据块(如矩阵、配置)动态集合(如列表、动态数组)键值关联(如字典、缓存)

关键细节

  1. 数组

    • 长度是类型的一部分,[3]int 和 [5]int 是不同的类型。

    • 值传递导致复制开销,适合小数据集。

  2. 切片

    • 底层依赖数组,多个切片可共享同一数组(修改相互影响)。

    • append 可能触发扩容,返回新切片(需重新赋值)。

    • 空切片([]int{})和 nil 切片(未初始化)行为类似但不等价。

  3. 映射

    • 键必须支持 == 操作,禁止使用切片、函数等不可哈希类型。

    • 遍历顺序随机(Go 设计特性),不能依赖顺序。

    • 并发读写需加锁或使用 sync.Map


示例对比

// 数组
arr := [3]int{1, 2, 3}  // 长度固定为3

// 切片
sli := make([]int, 2, 5) // 长度2,容量5
sli = append(sli, 4)     // 长度变为3,容量可能扩容

// 映射
m := make(map[string]int)
m["key"] = 10            // 动态添加键值对

总结

  • 数组:定长、值类型,适合固定大小的数据块。

  • 切片:动态数组、引用类型,灵活处理动态集合。

  • 映射:键值对、哈希表实现,适合快速查找和关联数据。

相关文章:

  • Mobile-Agent-V:通过视频引导的多智体协作学习移动设备操作
  • PCDN 在去中心化互联网中的角色
  • 个人.clang-format配置,适合Linux C/C++
  • 韩顺平教育-家居网购
  • 搜广推校招面经五十四
  • 【从0到1学Redis】Redis基础篇
  • 生信分析服务作图TCGA/GEO数据库挖掘细胞测序转录学代做指导辅导
  • 靶场(十三)---小白心得思路分享---Levram
  • 基于Netty实现高性能HTTP反向代理
  • Python-素数
  • 提示词prompt如何写
  • 前端项目打包构建优化
  • 苍穹外卖-阿里云OSS使用
  • jasypt-spring-boot-starter项目如何使用jasypt加密密码
  • Unity 接入抖音小游戏
  • HTML中required与aria required区别
  • 一条SQL在mysql数据库中经历的过程
  • VUE管理后台开发-vue-element-admin
  • 字符串模板(单文件组件、JSX)
  • IDEA+Docker插件一键部署SpringBoot项目到远程服务器
  • 金砖国家外长会晤主席声明(摘要)
  • 国务院食安办:加强五一假期食品生产、销售、餐饮服务环节监管
  • “75后”袁达已任国家发改委秘书长
  • 上汽集团一季度净利润30.2亿元,同比增长11.4%
  • 2025上海体育消费节启动,多形式联动打造体育消费盛宴
  • 华侨城A:一季度营收53.63亿元,净利润亏损14.19亿元