Go 语言中的切片:灵活的数据结构
切片(slice)是 Go 语言中一种非常重要且灵活的数据结构,它提供了对数组子序列的动态窗口。这使得切片在 Go 中的使用非常频繁,特别是在处理动态数据集时。本文将探讨切片的概念、操作和与函数的交互,以及如何有效地使用切片来处理数据。
文章目录
- 1、切片概念
- 1.1、基本介绍
- 1.2、创建与初始化
- 1.3、切片操作
- 2、使用切片
- 2.1、传递切片到函数
- 2.2、切片的内存组织
- 2.3、创建切片
- 3、切片与数组的区别
- 3.1、数组
- 3.2、切片
- 4、多维切片
- 5、For-range 结构
1、切片概念
1.1、基本介绍
切片是对底层数组的连续片段的引用,使得切片成为了引用类型。它的长度可以在运行时改变,其长度永远不会超过其容量,即 0 <= len(s) <= cap(s)
。切片的灵活性在于,你可以使用切片来访问数组的任何连续部分,而无需复制其元素。
1.2、创建与初始化
切片可以通过简单的切片表达式来创建:
var slice1 []type = arr1[start:end]
这样 slice1
将引用 arr1
中从 start
到 end-1
的部分。如果省略 start
或 end
,默认分别为 0 和数组的长度。例如,arr1[:]
创建一个完整的数组切片。
你还可以直接初始化切片:
s := []int{1, 2, 3}
1.3、切片操作
切片支持多种操作,包括重新切片和索引访问。重新切片可以扩展或缩减切片的长度,但不能超过其容量。如果需要超过容量的切片,可以使用内置的 append
函数,它可以动态地增加切片的容量。
s := []int{1, 2, 3}
s = append(s, 4) // 追加元素到切片
2、使用切片
2.1、传递切片到函数
由于切片是引用类型,将切片传递到函数中非常高效,不涉及数据复制。例如,计算切片所有元素的和:
func sum(s []int) int {total := 0for _, v := range s {total += v}return total
}
2.2、切片的内存组织
在内存中,切片由三部分组成:指向底层数组的指针、切片的长度和容量。这种结构使得切片操作高效且灵活。
2.3、创建切片
除了基于数组的切片创建外,可以使用 make
函数直接创建切片:
s := make([]int, 10, 20)
这里 s
是一个长度为 10,容量为 20 的切片。这种方式允许我们在未定义数组的情况下直接操作切片。
3、切片与数组的区别
切片和数组在 Go 中都用于存储序列数据,但它们的设计目的和使用方式有所不同。
3.1、数组
数组是具有固定大小的数据结构,定义时需要指定元素数量,这个数量在数组生命周期内不能改变。数组的长度是其类型的一部分,例如 [5]int
和 [10]int
是不同的类型。数组的这种固定大小的特性意味着在数组创建时,内存就被分配且大小不会改变。
3.2、切片
切片则提供了更大的灵活性和功能:
- 动态大小:切片的长度可在运行时改变,提供了类似动态数组的功能。
- 容量和长度:切片有两个属性,长度(当前元素数量)和容量(底层数组可以容纳的元素数量)。切片可以通过
append
函数动态扩展,当容量不足以容纳更多元素时,Go 会自动扩展容量。 - 基于引用:切片通过引用底层数组来存储元素,这意味着多个切片可以共享同一个数组的部分或全部,修改一个切片的元素可能会影响共享同一数组的其他切片。
因此,当需要一个容量可变的数据集时,切片是一个比数组更合适的选择。切片的这些特性使得它在处理不确定大小的数据集时特别有用。
4、多维切片
与数组不同,切片可以很方便地创建和操作多维数据结构,因为每一个维度都可以独立地扩展和收缩。
多维切片通常通过切片的切片来实现,例如 [][]int
表示一个二维整数切片。每一个内层切片可以独立地进行增长或收缩,这为处理如不规则表格数据提供了极大的灵活性。
例如,初始化一个动态的二维切片并赋值:
rows := 2
cols := 3
matrix := make([][]int, rows)
for i := range matrix {matrix[i] = make([]int, cols)for j := range matrix[i] {matrix[i][j] = i + j}
}
这种灵活性使得切片成为处理复杂数据结构的理想选择,特别是当数据结构的维度在运行时可能变化时。
5、For-range 结构
for-range
结构提供了一种简洁的方式来迭代数组和切片中的每个元素。这种结构自动处理索引和元素的提取,使得代码更清晰、更易于维护。
当使用 for-range
循环遍历切片或数组时,每次迭代会返回两个值:索引和该索引位置的元素的副本。如果你只需要元素值,可以忽略索引:
slice := []int{1, 2, 3}
for _, value := range slice {fmt.Println(value)
}
如果你需要修改元素的值,应该使用索引直接
访问元素:
for i := range slice {slice[i] *= 2
}
这种结构也适用于多维切片,每一层迭代可以处理一个维度。
通过结合切片的灵活性和 for-range
结构的易用性,Go 程序员可以有效地处理各种复杂和动态的数据集。
相关文章:
Go 语言中的切片:灵活的数据结构
切片(slice)是 Go 语言中一种非常重要且灵活的数据结构,它提供了对数组子序列的动态窗口。这使得切片在 Go 中的使用非常频繁,特别是在处理动态数据集时。本文将探讨切片的概念、操作和与函数的交互,以及如何有效地使用…...

在鲲鹏服务器搭建k8s高可用集群分享
高可用架构 本文采用kubeadm方式搭建k8s高可用集群,k8s高可用集群主要是对apiserver、etcd、controller-manager、scheduler做的高可用;高可用形式只要是为: 1. apiserver利用haproxykeepalived做的负载,多apiserver节点同时工作…...
MySQL之数据库事务机制学习笔记(五)
事务机制 事务(Transaction)是数据库管理系统中的一个重要概念,它是一组数据库操作的逻辑单元,要么全部执行成功,要么全部执行失败,具有以下四个特性,通常缩写为 ACID: 原子性&…...
linux 系统被异地登录,cpu占用拉满100%
一般是kswapd0导致的cpu占用异常 按顺序执行以下操作 在控制台执行top命令,查看占用最高的是否kswapd0。基本100%占用。记下该进程ID 5081 执行查找命令 find / -name kswapd0 显示查找结果: /proc/3316/.X2c4-unix/.rsync/a/kswapd0 /root/.configrc…...

智慧校园应用平台的全面建设
在当今社会,随着科技的不断进步,智慧校园应用平台逐渐成为学校管理的必备工具。在实现智慧校园全面建设的过程中,学校需要运用先进的技术和创新的理念,为教育提供更好的服务和支持。这篇文章将为您介绍智慧校园应用平台的全面建设…...
图论第6天
提高效率!!!两道题看并查集 841.钥匙和房间 忘了把visited 加引用了:& class Solution { public:bool canVisitAllRooms(vector<vector<int>>& rooms) {vector<int>visited(rooms.size(),false);dfs(rooms,visited,0);for(int i 0;i …...
Redis教程(二十一):Redis怎么保证缓存一致性
传送门:Redis教程汇总篇,让你从入门到精通 Redis 的缓存一致性 Redis 的缓存一致性是指在使用 Redis 作为缓存层时,保证缓存中的数据与数据库中的数据保持一致的状态。在分布式系统中,数据一致性是一个重要的问题,因为可能存在多个客户端同时读写同一数据,或者数据在不同…...
android apk签名
android apk签名 命令: java -jar signapk.jar platform.x509.pem platform.pk8 **.apk ***.apk note: apk密钥为: platform.pk8和platform.x509.pem 路径: build\target\product\security apk签名工具:sign…...
flutter 解析json另类封装方式 List<bean>,哈哈哈
flutter 解析json另类封装方式,哈哈哈 日常学习,仅供参考,不喜 勿喷 http请求数据泛型解析封装,需要判断泛型数据类型再根据类型解析,本文只抽取了list演示 核心代码 import dart:convert;import package:webwsyn/h…...
哈希表(Hash table)
哈希表(Hash table),也称为散列表,是一种根据关键码值(Key value)直接进行访问的数据结构。它通过散列函数(Hash function)将关键码值映射到表中的一个位置,以此来访问记录,从而加快查找的速度。以下是关于哈希表的详细解释: 基本概念 散列函数:将关键码值映射到表…...

【c语言】自定义类型-结构体
结构体 结构体的声明与使用结构体的声明与初始化结构体的自引用 结构体的内存对齐对齐规则为什么存在内存对齐修改默认对齐数 结构体的传参结构体实现位段什么是位段位段的内存分配位段的跨平台问题位段使用的注意事项 结构体:是一个自定义的类型,成员可…...
2-链表-71-环形链表 II-LeetCode142
2-链表-71-环形链表 II-LeetCode142 参考:代码随想录 LeetCode: 题目序号142 更多内容欢迎关注我(持续更新中,欢迎Star✨) Github:CodeZeng1998/Java-Developer-Work-Note 技术公众号:CodeZeng1998&#…...

【UnityShader入门精要学习笔记】第十七章 表面着色器
本系列为作者学习UnityShader入门精要而作的笔记,内容将包括: 书本中句子照抄 个人批注项目源码一堆新手会犯的错误潜在的太监断更,有始无终 我的GitHub仓库 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 文章目录 表面着色器…...
Python社会经济 | 怀特的异方差一致估计量
🎯要点 🎯算法和模型底层数学及代码:🖊线性代数应用(主成分分析):降维、投影(用于求解线性系统)和二次形式(用于优化)| 🖊奇值分解…...
《被讨厌的勇气》笔记
自由就是被别人讨厌。对人而言,最大的不幸就是不喜欢自己。活在“如果怎样怎样”之类的假设之中,就根本无法改变。活在害怕关系破裂的恐惧之中,那是为他人而活的一种不自由的生活方式。人生是连续刹那,我们只能活在“此时此刻”。…...

Python爬虫协程批量下载图片
import aiofiles import aiohttp import asyncio import requests from lxml import etree from aiohttp import TCPConnectorclass Spider:def __init__(self, value):# 起始urlself.start_url value# 下载单个图片staticmethodasync def download_one(url):name url[0].spl…...
Flask Web开发基础:数据库与ORM实战
Flask Web开发基础:数据库与ORM实战 该文介绍了如何使用 Flask、SQLAlchemy 和 SQLite 实现数据库操作。首先,通过创建虚拟环境和安装 flask-sqlalchemy(版本2.5.1)及 sqlalchemy(版本1.4.47)来设置环境。接…...

pidstat -d 1分析磁盘吞吐量
iostat -dx 1 查看磁盘IO吞吐量 pidstat -d 1看是哪个进程写的...

期望20K,2年golang深圳某互联网小公司一面
后续约了二面(CTO面),需要到现场,基本没问啥具体的技术知识,都是聊规划和个人职业目标 一面 1、假设访问百度网站,从在浏览器输入网址,到最终页面展示出来,中间会发生哪些事情&…...

#02 安装指南:如何配置Stable Diffusion环境
文章目录 前言前置条件第1步:安装Python和PIP第2步:创建虚拟环境第3步:安装PyTorch和CUDA第4步:安装Stable Diffusion相关库第5步:测试环境结论 前言 在之前的文章中,我们介绍了Stable Diffusion基础入门和…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...

实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...