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

server/2025/3/20 18:29:26/

在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            // 动态添加键值对

总结

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

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

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


http://www.ppmy.cn/server/176562.html

相关文章

Qt-概述

1.背景介绍 1.1什么是Qt Qt 是⼀个 跨平台的 C 图形⽤⼾界⾯应⽤程序框架 。它为应⽤程序开发者提供了建⽴艺术级图形界⾯所需的所有功能。它是完全⾯向对象的,很容易扩展。Qt 为开发者提供了⼀种基于组件的开发模式,开发者可以通过简单的拖拽和组合来…

LeetCode-490 迷宫问题(DFS)

题目描述 由空地和墙组成的迷宫中有一个球,球可以向上下左右四个方向滚动,但在遇到墙壁前不会停止滚动。当球停下时,可以选择下一个方向。给定球的起始位置、目的地和迷宫。判断球能否在目的地停下。 思路分析: 迷宫由一个0和1的二…

DeepSeek私有化部署与安装浏览器插件内网穿透远程访问实战

文章目录 前言1. 本地部署OllamaDeepSeek2. Page Assist浏览器插件安装与配置3. 简单使用演示4. 远程调用大模型5. 安装内网穿透6. 配置固定公网地址 前言 最近,国产AI大模型Deepseek成了网红爆款,大家纷纷想体验它的魅力。但随着热度的攀升&#xff0c…

rip 协议详细介绍

以下是关于 RIP(Routing Information Protocol,路由信息协议) 的详细介绍,涵盖其工作原理、版本演进、配置方法、优缺点及实际应用场景。 1. RIP 协议概述 类型:动态路由协议,基于距离矢量算法&#xff08…

MySQL -- 复合查询

数据库的查询是数据库使用中比较重要的环节,前面的基础查询比较简单,不做介绍,可自行查阅。本文主要介绍复合查询,并结合用例进行讲解。 本文的用例依据Soctt模式的经典测试表,可以自行下载,也可以自己创建…

AI赋能生态学:ChatGPT+多技术融合在生态系统服务中的实践探索与学术写作

查看原文 >>> AI赋能生态学:ChatGPT多技术融合在生态系统服务中的实践探索与学术写作 第一章:AI在生态科研中的应用、文献调研与研究设计 1、AI在生态科研中的作用 l介绍AI基本概念:机器学习、深度学习、自然语言处理(…

应用商店上新:Couchbase Enterprise Server集群

可移植的冗余数据平台,这往往是创建可扩展的云原生应用程序的先决条件。而不依赖特定平台的工具可用于为多云、多区域工作负载提供企业级应用所需的灵活性。 ​Couchbase是一种高性能NoSQL数据库,专为当今复杂的云生态系统所需的动态扩展能力而设计。最近…

4、linux c 进程

【三】进程 1. 进程与程序的区别 程序:存放在磁盘上的指令和数据的有序集合(文件),是静态的。 进程:执行一个程序所分配的资源的总称,是动态的。 2. 进程的组成部分 BSS段(bss)&…