Golang 切片

前言

在Go语言中,切片是一个引用类型,它提供了对数组的动态窗口。切片并不存储任何数据,它只是描述了底层数组中的一个片段。切片的定义包括三个部分:指向数组的指针、切片的长度和切片的容量

基本使用

  1. 声明切片:声明一个未初始化的切片,其值为nil
var s []int
  1. 创建并初始化切片
  • 可以通过make函数创建切片,并指定切片的长度和容量
s := make([]int, 5) // 长度和容量都是5
  • 切片也可以通过字面量进行初始化:
s := []int{1, 2, 3, 4, 5}
  1. 切片现有数组:可以从一个数组或另一个切片创建新的切片
arr := [5]int{1, 2, 3, 4, 5}
s := arr[1:3] // 创建一个新切片,包含arr[1]到arr[2]
  1. 切片的长度和容量
  • 长度:切片中元素的数量,使用len(s)获取。
  • 容量:从切片的开始位置到底层数组结束位置的元素数量,使用cap(s)获取
fmt.Println(len(s)) // 输出切片的长度
fmt.Println(cap(s)) // 输出切片的容量
  1. 切片扩展和收缩:可以重新切片来扩展或收缩一个切片,但不能超过其容量
s = s[:4] // 扩展切片的长度到4,如果容量允许的话
  1. 添加元素到切片:使用append函数可以向切片添加新元素,如果超过原切片的容量,将自动分配新的底层数组
s = append(s, 6) // 添加元素6到切片
  1. 遍历切片:可以使用for循环来遍历切片
for i, value := range s {fmt.Println(i, value) // 输出索引和对应的值
}

排序

对切片排序通常使用标准库中的sort包,sort包提供了针对切片的排序函数,可以对不同类型的切片进行排序,包括整数、浮点数、字符串切片等。此外,也可以自定义排序规则
举几个例子

  1. 整数切片
import "sort"func main() {s := []int{3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5}sort.Ints(s)fmt.Println(s) // 输出: [1 1 2 3 3 4 5 5 5 6 9]
}
  1. 字符串切片
import "sort"func main() {s := []string{"apple", "pear", "banana", "peach"}sort.Strings(s)fmt.Println(s) // 输出: [apple banana peach pear]
}
  1. 浮点数切片
import "sort"func main() {s := []float64{3.14, 1.59, 2.65, 3.58}sort.Float64s(s)fmt.Println(s) // 输出: [1.59 2.65 3.14 3.58]
}
  1. 自定义排序规则
import "sort"type Person struct {Name stringAge  int
}func main() {people := []Person{{"Bob", 31},{"John", 42},{"Michael", 17},{"Jenny", 26},}// 按年龄排序sort.Slice(people, func(i, j int) bool {return people[i].Age < people[j].Age})fmt.Println(people) // 输出: [{Michael 17} {Jenny 26} {Bob 31} {John 42}]
}

降序
可以使用自定义排序,也可以用sort.Reverse配合sort.Sort来达成降序目的

  • sort.Reverse 函数接受一个 sort.Interface 类型的参数,并返回一个新的 sort.Interface
  • sort.Sort 对这个逆序接口进行排序
    例1:int类型切片逆序
import ("fmt""sort"
)func main() {list := []int{3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5}// sort.Reverse 返回的是 sort.Interface 类型// sort.IntSlice(list) 转换切片为 sort.IntSlice 类型,这样就可以使用 sort.Reversesort.Sort(sort.Reverse(sort.IntSlice(list)))fmt.Println(list) // 输出: [9 6 5 5 5 4 3 3 2 1 1]
}

例2:float64类型切片逆序

import ("fmt""sort"
)func main() {list := []float64{3.14, 1.59, 2.65, 3.58}sort.Sort(sort.Reverse(sort.Float64Slice(list)))fmt.Println(list) // 输出: [3.58 3.14 2.65 1.59]
}

例3:string类型切片逆序

import ("fmt""sort"
)func main() {list := []string{"apple", "pear", "banana", "peach"}sort.Sort(sort.Reverse(sort.StringSlice(list)))fmt.Println(list) // 输出: [pear peach banana apple]
}

例4:自定义结构体类型Person切片逆序

import ("fmt""sort"
)type Person struct {Name stringAge  int
}// ByAge 实现 sort.Interface 来按年龄排序
type ByAge []Personfunc (a ByAge) Len() int           { return len(a) }
func (a ByAge) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
func (a ByAge) Less(i, j int) bool { return a[i].Age > a[j].Age } // 降序func main() {people := []Person{{"Bob", 31},{"John", 42},{"Michael", 17},{"Jenny", 26},}sort.Sort(ByAge(people))fmt.Println(people) // 输出: [{John 42} {Bob 31} {Jenny 26} {Michael 17}]
}

熟悉后,其他用法可自行探索

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

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

相关文章

Django在urls.py利用函数path()配置路由时传递参数给调用的视图函数的方法

01-单个参数的传递 问&#xff1a;在urls.py利用函数path()配置路由时能不能传递一些参数给调用的视图函数&#xff1f;因为我有很多路由调用的其实是同一个视图函数&#xff0c;所以希望能传递一些额外的参数。比如路由的PATH信息如果能传递就好了。 答&#xff1a;在Django中…

伐木工 - 华为OD统一考试

OD统一考试 题解&#xff1a; Java / Python / C 题目描述 一根X米长的树木&#xff0c;伐木工切割成不同长度的木材后进行交易&#xff0c;交易价格为每根木头长度的乘积。规定切割后的每根木头长度都为正整数,也可以不切割&#xff0c;直接拿整根树木进行交易。请问伐木工如…

MySQL 日期比较

MySQL日期格式比较常用的两个函数是DATEDIFF()和TIMESTAMPDIFF()。 DATEDIFF SELECT DATEDIFF(2023-12-31 23:59:59, 2023-12-30); # 1SELECT DATEDIFF(2023-11-30 23:59:59, 2023-12-31); # -31第一个参数减去第二个参数得到的天数。 TIMESTAMPDIFF SELECT TIMESTAMPDIFF(…

libexif库介绍

libexif是一个用于解析、编辑和保存EXIF数据的库。它支持EXIF 2.1标准(以及2.2中的大多数)中描述的所有EXIF标签。它是用纯C语言编写的&#xff0c;不需要任何额外的库。源码地址&#xff1a;https://github.com/libexif/libexif &#xff0c;最新发布版本为0.6.24&#xff0c;…

计算圆弧的起始角度、终止角度和矩形信息并使用drawArc绘制圆弧

Qt中常用绘制圆弧的库函数&#xff1a; //函数原型 void QPainter::drawArc(const QRectF &rectangle, int startAngle, int spanAngle)Qt规定1约占16个像素&#xff0c;比如一个完整的圆等于360度&#xff0c;对应的像素角度就是 5760度&#xff08;16 * 360&#xff09;…

深度学习中的自动化标签转换:对数据集所有标签做映射转换

在机器学习中&#xff0c;特别是在涉及图像识别或分类的项目中&#xff0c;标签数据的组织和准确性至关重要。本文探讨了一个旨在高效转换标签数据的 Python 脚本。该脚本在需要更新或更改类标签的场景中特别有用&#xff0c;这是正在进行的机器学习项目中的常见任务。我们将逐…

基于JavaWeb+SSM+Vue家政项目微信小程序系统的设计和实现

基于JavaWebSSMVue家政项目微信小程序系统的设计和实现 源码获取入口Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 Lun文目录 目录 1系统概述 1 1.1 研究背景 1 1.2研究目的 1 1.3系统设计思想 1 2相关技术 2…

如何使用RESTful API构建 web 应用程序

RESTful API 是一种设计风格&#xff0c;用于构建可扩展、灵活和可维护的 web 应用程序。它是一种基于 HTTP 协议的架构风格&#xff0c;旨在提供一组规范和约束&#xff0c;以便客户端和服务器之间的通信更加简单和可预测。 RESTful API 通过使用 HTTP 动词来定义资源的操作&…

【DevOps-01]】DevOps介绍

一、简要描述 DevOps:Development & Operations的缩写,也就是开发&运维 DevOps是一个不断提高效率并且持续不断工作的过程。 核心:简化Dev和Ops团队之间的流程,使整体软件开发过程更快速。 DevOps定义: DevOps 强调的是高效组织团队之间如何通过自动化的工具协作和…

数据结构OJ实验16-选择排序与堆排序与归并排序

A. DS排序--简单选择排序 题目描述 给出一个数据序列&#xff0c;使用简单选择排序算法进行升序排序。 输入 第一行输入t&#xff0c;表示有t个测试示例 第二行输入n&#xff0c;表示第一个示例有n个数据(n>1) 第三行输入n个数据&#xff0c;都是正整数&#xff0c;数据…

MyBatis 进阶

MyBatis 进阶 复杂CURD返回设置返回类型&#xff1a;resultType返回字典映射&#xff1a;resultMap 多表查询动态SQL使⽤<<if>if>标签<trim\>标签<where\>标签<set\>标签<foreach\>标签 其他打开日志单元测试不污染数据库 复杂CURD 返回设…

docker 一些有用的操作

创建一个网络组 docker network create xxx(网络名称) docker network inspect xxx 网络的配置信息 docker network list 所有网络的列表docker部署 1 编写Dockerfile文件 2 打包镜像 docker build -t 镜像名 . 3 运行镜像 docker run -d -p 5001:5001 --net 网络名称 --na…

Model::unguard()的作用

这是在生成假数据时碰见的&#xff0c;浅查了一下 Model::unguard() 是 Laravel 框架中的一个方法&#xff0c;它的作用是取消对 Eloquent 模型的属性赋值的安全性保护。 在默认情况下&#xff0c;Laravel 的 Eloquent 模型会对属性赋值做一些安全性检查&#xff0c;例如防止…

Java:IO流详解

文章目录 基础流1、IO概述1.1 什么是IO1.2 IO的分类1.3 顶级父类们 2、字节流2.1 一切皆为字节2.2 字节输出流 OutputStream2.3 FileOutputStream类2.3.1 构造方法2.3.2 写出字节数据2.3.3 数据追加续写2.3.4 写出换行 2.4 字节输入流 InputStream2.5 FileInputStream类2.5.1 构…

LeetCode 225.用队列实现栈(详解) ૮꒰ ˶• ༝ •˶꒱ა

题目详情&#xff1a; 思路&#xff1a;1.定义两个队列用于存储栈的数据&#xff0c;其中一个为空。 2.对我们定义的栈进行入数据&#xff0c;就相当于对不为空的队列进行入数据。 3.对我们定义的栈进行删除&#xff0c;相当于取出不为空的队列中的数据放到为空的队列中&#x…

线程的6中状态

这个6中状态是Java Thread类中的枚举值中来的。 public enum State {/*** Thread state for a thread which has not yet started.*/NEW,/*** Thread state for a runnable thread. A thread in the runnable* state is executing in the Java virtual machine but it may* be…

Springboot基于注解的AOP操作

注解类 package com.example.springaop.annotation;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/*** @module* @author:DUOLUONIANDAI* @DATA:20…

Java 线程池四种拒绝策略

文章目录 Java 线程池的拒绝策略 AbortPolicy 策略CallerRunsPolicy 策略DiscardPolicy 策略DiscardOldestPolicy 策略 Java 线程池的拒绝策略 Java 线程池的拒绝策略一共有四种&#xff0c;分别为AbortPolicy&#xff0c;CallerRunsPolicy&#xff0c;DiscardPolicy&#xff…

java基础之list 与set集合(ArrayList,LinkedList,HashSet,LinkedHashSet,TreeSet)

List集合 集合的概念 是一个容器,可以存放多个数据.通常用来替代数组 集合的特点 只能存放引用类型 所有集合都来自于java.util包 List、Set、Map都是接口 List的存储特点 有序、有下标、元素可以重复 常用实现类 ArrayList&#xff08;常用&#xff09; JDK1.2 底层数组…

vue之服务端渲染(SSR)

目录 一、认识 SSR二、创建一个 SSR 应用三、客户端激活四、代码结构五、第三方解决方案六、vue 提供的 SSR API1、renderToString()2、renderToNodeStream()3、pipeToNodeWritable()4、renderToWebStream()5、pipeToWebWritable()6、renderToSimpleStream()7、useSSRContext()…