03.切片的概念

news/2024/10/6 20:18:10/文章来源:https://www.cnblogs.com/JJJHaoran/p/18290911

切片(Slice)是 Go 语言中非常重要的一种数据结构,用于处理具有动态长度的序列。切片是对数组的抽象,可以更灵活地操作和管理数组的数据。下面详细介绍切片的概念及其核心特点。

切片的基本概念

定义

切片是一个引用类型,它指向一个底层数组的一部分或全部。与数组不同,切片的长度可以动态变化。切片包含三个部分:指针、长度和容量。

  • 指针:指向切片对应的底层数组的起始位置。
  • 长度:切片中实际元素的数量,可以使用内置函数 len 获取。
  • 容量:从切片的起始位置到底层数组的末尾位置之间的元素数量,可以使用内置函数 cap 获取。

初始化

切片可以通过多种方式初始化:

  1. 字面量初始化:直接使用字面量创建切片。
  2. 内置函数 make:使用 make 函数创建指定长度和容量的切片。
  3. 从数组或其他切片创建:通过对数组或其他切片的切片操作来创建。

示例

package mainimport "fmt"func main() {// 使用字面量初始化切片slice1 := []int{1, 2, 3, 4, 5}fmt.Println("slice1:", slice1)// 使用内置函数 make 初始化切片slice2 := make([]int, 5)fmt.Println("slice2:", slice2)// 从数组创建切片arr := [5]int{10, 20, 30, 40, 50}slice3 := arr[1:4]fmt.Println("slice3:", slice3)// 从其他切片创建切片slice4 := slice1[2:]fmt.Println("slice4:", slice4)
}

 

切片的特点

  1. 动态长度:切片的长度可以动态变化,可以通过 append 函数向切片添加元素。

  2. 底层数组共享:多个切片可以共享同一个底层数组,对一个切片的修改可能影响其他切片。

  3. 值传递:切片本身是一个引用类型,但在传递时依然是值传递。即使传递的是引用,但底层数组仍然是共享的。

  4. 零值切片:切片的零值是 nil,一个 nil 切片的长度和容量都是 0。

  5. 高效的内存管理:由于切片只是在底层数组上进行切片操作,因此创建切片非常高效,不会复制底层数组。

切片操作

动态增长

使用 append 函数可以向切片中添加元素。如果底层数组容量不足,append 会创建一个新的数组并将原有数据复制过去。

package mainimport "fmt"func main() {slice := []int{1, 2, 3}slice = append(slice, 4, 5)fmt.Println("Appended slice:", slice)
}

 

切片的切片

可以对一个切片再进行切片操作,新的切片仍然共享原始切片的底层数组。

package mainimport "fmt"func main() {slice := []int{1, 2, 3, 4, 5}subSlice := slice[1:4]fmt.Println("subSlice:", subSlice)
}

 

获取长度和容量

使用内置函数 len 获取切片的长度,使用 cap 获取切片的容量。

package mainimport "fmt"func main() {slice := []int{1, 2, 3, 4, 5}fmt.Println("Length:", len(slice))fmt.Println("Capacity:", cap(slice))
}

 

切片的应用场景

切片在 Go 语言中有广泛的应用场景,特别适合处理动态大小的数据集合,如:

  • 实现栈、队列等数据结构
  • 处理和操作字符串
  • 动态集合的处理,如读取文件行、网络数据包等

总结

切片是 Go 语言中用于处理动态长度序列的灵活且高效的数据结构。通过对切片的指针、长度和容量的管理,Go 提供了在不牺牲性能的前提下灵活处理数组数据的能力。了解和掌握切片的概念和使用方法对于编写高效和可维护的 Go 代码至关重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/740856.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pandas我这个填充nan值为什么填充不上呢?

大家好,我是Python进阶者。 一、前言 前几天在Python钻石交流群【逆光】问了一个Python数据处理的问题,问题如下:请问一下,我这个填充nan值为什么填充不上呢二、实现过程 这里【瑜亮老师】给了个思路如下:试试看这样,代码如下: sf_mergetotal.loc[sf_mergetotal[寄件人]…

python matplot绘图工具练习

matplot 数据可视化 seaborn# pyplot import matplotlib.pyplot as plt import numpy as np import seaborn as sns import pandas as pdx_point = np.array([0,6]) y_point = np.array([0,100]) plt.plot(x_point,y_point,b-.v) # 格式处理 plt.show()x = np.arange(0,4…

R语言用逻辑回归、决策树和随机森林对信贷数据集进行分类预测|附代码数据

原文链接:http://tecdat.cn/?p=17950 最近我们被客户要求撰写关于的研究报告,包括一些图形和统计输出。在本文中,我们使用了逻辑回归、决策树和随机森林模型来对信用数据集进行分类预测并比较了它们的性能数据集是 credit=read.csv("gecredit.csv", header = T…

代码随想录算法训练营第27天 | 122.买卖股票的最佳时机 II 55. 跳跃游戏 1005.K次取反后最大化的数组和

122.买卖股票的最佳时机 II 给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。 在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。 返回 你能获得的 最大 利润 。 解题: 思路:最…

R语言实现 Copula 算法建模相依性案例分析报告

原文链接:http://tecdat.cn/?p=6193 原文出处:拓端数据部落公众号copula是将多变量分布函数与其边缘分布函数耦合的函数,通常称为边缘。Copula是建模和模拟相关随机变量的绝佳工具。Copula的主要吸引力在于,通过使用它们,你可以分别对相关结构和边缘(即每个随机变量的分…

【视频讲解】Python、R时间卷积神经网络TCN与CNN、RNN预测时间序列3实例附代码数据

全文链接:https://tecdat.cn/?p=36944 原文出处:拓端数据部落公众号 本文旨在探讨时间卷积网络(Temporal Convolutional Network, TCN)与CNN、RNN在预测任务中的应用。通过引入TCN模型,我们尝试解决时间序列数据中的复杂依赖关系,以提高预测的准确性。本文首先介绍了TCN…

反转链表

目录L206 反转链表题目描述题解方法一:迭代方法二:递归L92 反转链表 II题目描述题解方法一:一遍扫描方法二:穿针引线L25 K个一组反转链表题目描述题解方法一:模拟 L206 反转链表 题目描述 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例1:示例2:题…

springboot 进程已结束,退出代码为 0

原文:https://blog.csdn.net/lvoelife/article/details/134129860 在pom.xml中,添加<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>然后用maven,重新加载项目…

G64【模板】线性基 贪心法 P3812 最大异或和

视频链接: P3812 【模板】线性基 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)// 线性基 O(63*n) #include <iostream> #include <cstring> #include <algorithm> using namespace std;typedef long long LL; int n; LL p[64];void insert(LL x){ //贪…

相机的标定

Camera-calibration 用于矫正相机的畸变代码部分 #打开摄像头,将读取的视频保存在本地,名字叫output.avi# coding=utf-8 import cv2 as cv cap = cv.VideoCapture(0) # 检查是否成功打开摄像头 if not cap.isOpened():print("Cannot open camera")exit() # 获取摄像…

关于golang函数传参问题

今天在写leetcode的一个简单问题的时候发现golang的切片传递并不是直接 传递地址的,而是一个地址副本。如图所示,当我利用test函数对nums1和nums2数组处理时,并不是对原来的nums1和nums2做处理,而是对他们的副本nums1_temp和nums2_temp做处理,但是nums1_temp和nums1都指向…

PN转Modbus RTU模块连接ACS4QQ变频器通信

巴图自动化PN转Modbus RTU模块(BT-MDPN10)的主要功能是实现Modbus协议和Profinet协议之间的转换和通信。PN转Modbus RTU模块集成了Modbus和Profinet两种协议,支持Modbus RTU主从站,可连接变频器、智能高低压电器、功率测量设备等RS485/232接口设备。一台完整的机器在出厂前由…