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基础入门和…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
