Go语言程序设计(五)切片

news2024/11/28 2:50:12

一、切片的定义

        在Go语言中,切片(Slice)是数组的一个引用,它会生成一个指向数组的指针,并通过切片长度关联到底层数组部分或者全部元素。切片还提供了一系列对数组的管理功能(append、copy),可以随时动态扩充存储空间,并且可以被随意传递而不会导致所管理的数组元素被重复复制。根据以上特征,切片通常被用来实现变长数组,而且操作灵活。

切片的数据结构原型定义如下:

src/ pkg/ runtime/ runtime. h

struct Slice
{                   //must not move anything
    byte* array;    //actual data
    unit32 len;     //number of elements
    unit32 cap;     //allocated number of elements
};

由切片数据结构的原型定义可以看到,它抽象为以下三个部分:

  • 指向被引用的底层数组的指针。
  • 切片中元素的个数。
  • 切片分配的存储空间。

二、切片的声明与创建

切片声明与创建的方法有三种:基于底层数组创建、直接创建或使用make()函数创建。

1、基于底层数组创建

在创建切片时,可以基于一个底层数组,切片可以只使用数组的一部分元素或所有元素,甚至可以创建一个比底层数组还要大的数组切片,因为切片可以动态增长。创建切片的格式如下:

var sliceName [ ]dataType

说明:

  1. 切片名的命名规则和变量名相同,遵循标识符命名规则。
  2. 在创建切片时,不要指定切片的长度。
  3. 切片的类型可以是Go语言的任何基本数据类型。

例如:

var slice1 [] int

        上例中定义了一个整型切片slicel,注意不要指定切片长度,如果指定了长度就成了定义数组了。当一个切片定义好以后,如果还没有被初始化,默认值为nil, 而且切片的长度为0。切片的长度可以使用内置函数len()获取,还可以使用内置函数cap()获取切片的内存容量。

所以,当一个切片定义好以后,还要对切片进行初始化,这样切片才可用。对于上例,假如已经定义了一个整型数组array1,则切片slice1的初始化方式如下:

slice1 = array1[start : end]

        从上式可以看到,Go语言支持以array1[start : end]的方式基于一个底层数组来生成切片,即切片引用的数组元素由array1[start]到 array1[end],但不包含array1[end]。

如果要引用底层数组的所有元素,可采取的方式如下:

slicel = array1
slice1 = array1[ :]
slicel = array1[0: len(array1)] 

2、直接创建切片

直接创建切片,即在定义切片的时候初始化切片元素,例如:

var slice1 =[]int{1,2,3,4,5}

3、使用make函数创建切片

内置函数make()用于灵活的创建切片

var slicel = make([]int,5)

上式创建了一个有5个元素的整型切片slicel,元素的初值为0。
在使用make()函数创建切片时,还可以为切片元素预留存储空间。例如:

var slice1 = make([]int, 5,10)

上式表示,创建整型切片slice1,元素个数为5,元素初值为0,并预留10个元素的存储空间。
 

三、切片元素的访问与遍历

        切片元素的遍历和数组元素的遍历一样,要通过元素下标访问,另外也可以使用关键字range遍历所有切片元素。切片元素访问的一般格式如下:

sliceName [sliceIndex]

遍历同数组,使用range关键字表达式,有两个返回值,第一个是元素的下标,第二个是元素的值。

四、切片的操作

1、切片元素的增加

        可以使用append()函数向切片尾部添加新元素,这些元素保存到底层数组。append并不会影响原来切片的属性,它返回变更后新的切片对象。

        与数组相比,除了都有长度(length)以外,切片多了一个容量(capacity)的概念,即切片中元素的个数和分配的存储空间是两个不同的值。如果在增加新元素时超出cap的限制,则底层会重新分配一块“够大”的内存,一般来说是将原来的内存空间扩大二倍,然后再将数据从原来的内存复制到新的内存块。

2、切片元素的复制

        使用切片长时间引用“超大”的底层数组,会导致严重的内存浪费。可以新建一个小的slice对象,然后将所需的数据复制过去。函数copy()可以在切片之间复制元素,能够复制的数量取决于复制方和被复制方的长度值,通常取最小值。需要注意的是,在同一底层数组的不同切片间复制元素时,元素位置会发生重叠。

//切片的复制
package main

import(
    "fmt" 
)

func main() {
    var slicel= []int{1,2,3,4,5,6,7,8,9,10}
    var slice2 = make([ ] int,3, 5)
    var n int
    //只能复制三个元素
    n= copy(slice2,slice1)
    fmt. Println(n, slice2, len( slice2), cap(slice2))
    //slice3和slice1指向同一底层数组
    slice3 : = slice1[3:6]
    //复制后元素重叠
    n= copy(slice3, slice1[1:5])
    fmt.Println(n, slicel, slice3)
}

编译并运行程序输出结果为:

3 [1 2 3] 3 5
3 [1 2 3 2 3 4 7 8 9 10] [2 3 4]

        通过输出结果可以看出,在将slice1复制到slice2时,由于slice2的长度最小为3,所以只能将slice1的前三个元素复制给slice2。而将slicel1复制到slice3 时,由于slicel1和slice3指向同一个底层数组,所以复制后元素重叠。slice3刚创建时,它引用的是底层数组的[4,5,6]三个元素,复制后slice1将[2,3,4]三个元素复制给slice3 ,所以最后slice3 的元素[2,3,4]覆盖了slice1的元素[4,5,6]。

3、排序和搜索切片

        标准库中的sort包提供了对整型、浮点型和字符串类型切片进行排序的函数,检查一个切片是否排序好的函数,以及使用二分搜索算法在一个有序切片中搜索-一个元素的函数。 同时提供了通用sort.Sort ()和sort.Search ()函数,可用于任何自定义的数据。这些函数在表4-2中有列出。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[RapidVideOCR周边] RapidVideOCR初级教程(界面版 下载解压即可使用)

引言 考虑到提取视频字幕的小伙伴大多不是程序员行当,为了降低使用门槛,特此推出界面版的RapidVideOCR Desktop.RapidVideOCR Desktop需要搭配VideoSubFinder使用。它们两个关系如下图所示: #mermaid-svg-keuknVOG1YkfjOkw {font-family:&qu…

在Linux中部署Ansible

Ansible是自动化运维工具,基于模块化工作,本身没有批量部署的能力。 Ansible只是提供一种框架,Ansible运行的模块才有批量部署的能力。 Ansible使用SSH协议对设备进行管理,只需在主控端部署Ansible环境,被控端无需做…

CSS+HTML实现元素定位

文章目录 相对定位 position: relative;总结 绝对定位 position: absolute;总结 固定定位 position: fixed;总结 z-index样式总结 数量角标透明度设置 opacity返回顶部 相对定位 position: relative; position: relative; 【示例代码&#xff1a;】 <!DOCTYPE html> &…

【广州华锐互动】智慧物流3D可视化数据分析展示平台

智慧物流3D可视化数据分析展示平台是一种基于数字孪生技术的新型物流管理工具&#xff0c;它可以帮助物流企业实现对物流过程的全面监控和管理。相比传统的物流管理方式&#xff0c;智慧物流3D可视化数据分析展示平台具有以下意义&#xff1a; 1.提高物流效率&#xff1a;智慧…

vue自定义菜单栏并循环便利使用

浅尝vue 前言&#xff1a; 在网上找了蛮多关于自定义表单对象进行循环处理&#xff0c;写的我都看的一脸懵&#xff0c;最后还是直接修改组件完善了&#xff0c;直接用v-for 进行循环绑定实现了。本例实现了自定义菜单栏和vue-router 路由指向菜单并进行路由跳转&#xff0c;主…

Idea打包Jar文件

https://blog.csdn.net/qq_35356840/article/details/98725948 注意这个坑&#xff1a;

html前端输入框模糊查询

1、一个页面内多个模糊查询情况&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"UTF-8" /> <meta name"viewport" content"widthdevice-width, initial-scale1.0, user-scalable0, minimum-scale1.0, maximum-…

PHP中的变量

在PHP中变量是用于储存信息的容器&#xff0c;我们命令服务器去干活的时候&#xff0c;往往需要产生一些数据&#xff0c;需要临时性存放起来&#xff0c;方便取用赋值方法与数学中的代数相类似 1、在PHP中变量是用于储存信息的容器&#xff0c;类似于数学中的集合 2、赋值方法…

ctf web解题系列————T1

文章目录 弱类型题目思路 基于PHP语言 弱类型 表示0乘10的123456次方。 题目 思路 此处为弱相等 使用hackbar进行调试 猜测&#xffe5;key为一个字符串&#xff0c;则化为数字–>0 直接在hackbar中输入令message的key值为0即可。 若不为纯字符&#xff0c;则采用枚举爆…

Rust in Action笔记 第十一、十二章 简易操作系统内核

本章讲了如何用Rust写一个简易的操作系统&#xff08;FledgeOS&#xff09;&#xff0c;除了Rust的知识外&#xff0c;可以了解操作系统主要的组成部分&#xff0c;加深对操作系统的理解 首选需要掌握和了解一些工具或者技术&#xff0c;QEMU是一种虚拟化技术&#xff0c;用于…

CANoe的面板控件input/output关联信号的问题分析

1、引子 当我们想在CANoe中制作一个面板,实现:在一个文本框中输入某个信号的值,点击发送按钮,就能把信号所在的CAN消息发送出去,此时信号的值就是文本框中输入的值。 要实现此功能很简单,在CANoe上新建一个面板,在工具箱中把Input/Output Box和Button两个控件拖到面板…

测试函数-ZDT函数.txt版本免费下载

多目标优化问题中&#xff0c;改进NSGA-II算法需要测试函数ZDT函数来查看改进的效果如何&#xff0c;大多博客下载需要积分&#xff0c;在这附上免费网址&#xff0c;大家自行下载。包含ZD1-ZDT6 如下 Emoobook - Appendix D

Azure 中 Linux的时间同步问题

问题概述 Azure环境中&#xff0c;将群集主机放置在不同的可用区。由于网络限制比较严格没有开启外部或内部NTP时间同步&#xff0c;而是考虑用Azure主机的时间同步&#xff0c;但群集会由于时间差异而出现异常告警信息。 问题分析 问题主要是以下原因形成&#xff1a; 自…

NSS [HNCTF 2022 Week1]2048

NSS [HNCTF 2022 Week1]2048 前端小游戏&#xff0c;小菜。 flag&#xff1a;

vue+Nodejs+Koa搭建前后端系统(七)-- 用户注册、注销

前言 前端采用vue3前端组件库采用ElementPlus本篇文章需要结合上一篇《vueNodejsKoa搭建前后端系统&#xff08;六&#xff09;-- 用户登录》一起看 客户端用户注册页面 添加注册页面 添加 /src/pages/register/register.vue 文件 安装md5 md5是加密插件&#xff0c;用于…

算力井喷、全球布局,亚马逊云科技生成式AI不断创新解决企业需求

时至今日&#xff0c;生成式AI在创意输出&#xff08;如写作、编程、设计&#xff09;、功能增强&#xff08;如写摘要、搜索&#xff09;、交互式体验&#xff08;Q&A、聊天&#xff09;和决策支持&#xff08;各类助理&#xff09;这四个领域已展现出惊人潜力。 在亚马逊…

软件测试外包

目录 前言&#xff1a; 评估软件测试服务提供商 为什么将测试外包出去 测试服务外包应当考虑因素 参与模式 地理位置 服务协议 灵活性 质量改进 如何选择测试外包服务商 需要什么外包 调查 互动 结论 前言&#xff1a; 在当今的软件开发行业中&#xff0c;越来越…

k8s Volume之Persistent Volume持久卷

一、Persistent Volume yaml详情&#xff1a; kind: PersistentVolume apiVersion: v1 metadata:# PV卷名称name: nfs-mvn-repo spec:# 容量capacity:# 存储大小storage: 20Ginfs:server: 192.168.80.170path: /srv/nfs/disk/mvn-repo# 该卷支持的访问模式accessModes:- ReadW…

SPEC CPU 2006 在 CentOS 5.0 x86_64 古老系统测试【2】

上一篇 SPEC CPU 2006 在 CentOS 5.0 x86_64 古老系统测试_hkNaruto的博客-CSDN博客 虚拟机时间&#xff0c;一天后获得结果 由于ssh版本太低&#xff0c;采用nc把文件拷贝出来 结果 SPEC CFP2006 Result Copyright 2006-2023 Standard Performance Evaluation Corporatio…

MES系统

MES系统&#xff0c;全称制造执行系统(Manufacturing Execution System)&#xff0c;是一种用于实时监控、追踪和控制生产过程的计算机化系统。 SAP Fiori概览 相信工作中接触过SAP的人&#xff0c;肯定对SAP Fiori不陌生。那什么是SAP Fiori呢&#xff1f; SAP Fiori是一种用于…