当前位置: 首页 > news >正文

Golang 切片 常用方法

文章目录

        • 移除指定位置的元素
        • 查找元素的位置
        • 查找最大最小的元素
        • 去重
        • 随机打乱
        • 排序
        • 二维排序
        • sort.Sort 排序

下面的方法省略一些校验,如数组越界等,且都采用泛型(要求go版本 >= 1.18)

移除指定位置的元素

package mainimport ("fmt"
)func Delete[T any](source []T, index int) []T {return append(source[:index], source[index+1:]...)
}func main() {fmt.Println(Delete([]int{1, 2, 3, 4, 5}, 3)) //[1,2,3,5]
}

查找元素的位置

找到返回位置,找不到返回 -1
也可以用来判断某个元素是否存在,大于 -1 即存在

package mainimport ("fmt"
)func Delete[T any](source []T, assert func(t T) bool) int {for index, item := range source {if assert(item) {return index}}return -1
}func main() {fmt.Println(Delete([]int{1, 2, 3, 4, 5}, func(t int) bool {return t == 3}))// 2
}

查找最大最小的元素

package mainimport ("fmt"
)func Find[T any](source []T, assert func(t1, t2 T) bool) T {max := source[0]for _, item := range source {if assert(max, item) {max = item}}return max
}func main() {fmt.Println(Find([]int{1, 2, 22, 8, 11, 3, 4, 5}, func(t1, t2 int) bool {return t2 > t1})) //22fmt.Println(Find([]int{1, 2, 22, 8, 11, 3, 4, 5}, func(t1, t2 int) bool {return t2 < t1})) //1
}

去重

T 使用 comparable 是因为 map 需要一个可比较的类型

package mainimport "fmt"func Uniq[T comparable](collection []T) []T {result := make([]T, 0, len(collection))seen := make(map[T]struct{}, len(collection))for _, item := range collection {if _, ok := seen[item]; ok {continue}seen[item] = struct{}{}result = append(result, item)}return result
}func main() {fmt.Println(Uniq([]int{6, 7, 6, 5})) //[6,7,5]
}

使用 struct{}{} 是因为它不占内存

package mainfunc main() {fmt.Println(unsafe.Sizeof(struct{}{})) // 0fmt.Println(unsafe.Sizeof(true))       // 1
}

随机打乱

这里引入了 i int64,这个是让他们的随机种子不一样,不然在 main中的 10次打印结果都一致

package mainimport ("fmt""math/rand""time"
)func random[T any](input []T, i int64) []T {rand.Seed(time.Now().Unix() + i)for i := len(input) - 1; i >= 0; i-- {index := rand.Intn(i + 1)input[index], input[i] = input[i], input[index]}return input
}func main() {for i := 0; i < 10; i++ {fmt.Println(random([]int{1, 2, 3, 4, 5, 6, 7, 8, 9}, int64(i)))}//下面的结果都一样for i := 0; i < 10; i++ {fmt.Println(random([]int{1, 2, 3, 4, 5, 6, 7, 8, 9}, 0))}
}

排序

这里展示的是选择排序,可以更换其它排序算法

package mainimport "fmt"func sort[T any](source []T, assert func(a, b T) bool) []T {for i := 0; i < len(source); i++ {for j := i + 1; j < len(source); j++ {if assert(source[i], source[j]) {source[j], source[i] = source[i], source[j]}}}return source
}func main() {r := sort([]int{1, 4, 3, 9, 7, 8, 5}, func(a, b int) bool {return a < b})fmt.Println(r) //[9 8 7 5 4 3 1]
}

二维排序

在排序的基础上增加了一个 index(要比较的元素位置),根据二维index位置的元素大小,来决定一维的排序位置

package mainimport "fmt"func TwoDimensionalSort[T any](source [][]T, index int, assert func(a, b T) bool) [][]T {for i := 0; i < len(source); i++ {for j := i + 1; j < len(source); j++ {//二维index位置上元素的比较if assert(source[i][index], source[j][index]) {//一维位置交换source[j], source[i] = source[i], source[j]}}}return source
}func main() {result := TwoDimensionalSort([][]int{{1, 3, 5}, {6, 2, 3}, {5, 9, 1}}, 2, func(a, b int) bool {return a > b})fmt.Println(result) //[[5 9 1] [6 2 3] [1 3 5]]result = TwoDimensionalSort([][]int{{1, 3, 5}, {6, 2, 3}, {5, 9, 1}}, 1, func(a, b int) bool {return a > b})fmt.Println(result) //[[6 2 3] [1 3 5] [5 9 1]]
}

sort.Sort 排序

进阶版本使用泛型加 sor.Sort 处理,算法由 sort.Sort 实现,而我只需要实现它排序对象的接口即可,Len()返回元素数量,Less() 比较方式 i 是否要 排在 j 前面,Swap() 交换方式

type Interface interface {// Len is the number of elements in the collection.Len() int// Less reports whether the element with index i// must sort before the element with index j.//// If both Less(i, j) and Less(j, i) are false,// then the elements at index i and j are considered equal.// Sort may place equal elements in any order in the final result,// while Stable preserves the original input order of equal elements.//// Less must describe a transitive ordering://  - if both Less(i, j) and Less(j, k) are true, then Less(i, k) must be true as well.//  - if both Less(i, j) and Less(j, k) are false, then Less(i, k) must be false as well.//// Note that floating-point comparison (the < operator on float32 or float64 values)// is not a transitive ordering when not-a-number (NaN) values are involved.// See Float64Slice.Less for a correct implementation for floating-point values.Less(i, j int) bool// Swap swaps the elements with indexes i and j.Swap(i, j int)
}
package mainimport ("fmt""sort"
)type SortStruct[T comparable] struct {Data   [][]TAssert func(a, b T) boolIndex  int
}func (s SortStruct[T]) Len() int {return len(s.Data)
}func (s SortStruct[T]) Less(i, j int) bool {return s.Assert(s.Data[i][s.Index], s.Data[j][s.Index])
}func (s SortStruct[T]) Swap(i, j int) {s.Data[i], s.Data[j] = s.Data[j], s.Data[i]
}func main() {result := SortStruct[int]{Data: [][]int{{1, 2, 3},{3, 1, 2},{6, 7, 8},},Assert: func(a, b int) bool {return a < b},Index: 1,}sort.Sort(result)fmt.Println(result.Data) //[[3 1 2] [1 2 3] [6 7 8]]
}

相关文章:

Golang 切片 常用方法

文章目录 移除指定位置的元素查找元素的位置查找最大最小的元素去重随机打乱排序二维排序sort.Sort 排序 下面的方法省略一些校验&#xff0c;如数组越界等&#xff0c;且都采用泛型(要求go版本 > 1.18) 移除指定位置的元素 package mainimport ("fmt" )func Del…...

【Linux后端服务器开发】poll/epoll多路转接IO服务器

目录 一、poll原理 二、poll实现多路转接IO服务器 三、epoll函数接口 四、epoll的工作原理 五、epoll实现多路转接IO服务器 一、poll原理 poll函数接口 #include <poll.h> int poll(struct pollfd *fds, nfds_t nfds, int timeout);// pollfd结构 struct pollfd …...

【设计模式——学习笔记】23种设计模式——命令模式Command(原理讲解+应用场景介绍+案例介绍+Java代码实现)

文章目录 案例引入介绍基础介绍登场角色 案例实现案例一实现 案例二介绍实现拓展 命令模式在JdbcTemplate源码中的应用总结文章说明 案例引入 有一套智能家电&#xff0c;其中有照明灯、风扇、冰箱、洗衣机&#xff0c;这些智能家电来自不同的厂家&#xff0c;我们不想针对每一…...

Rust中的高吞吐量流处理

本篇文章主要介绍了Rust中流处理的概念、方法和优化。作者不仅介绍了流处理的基本概念以及Rust中常用的流处理库&#xff0c;还使用这些库实现了一个流处理程序。 最后&#xff0c;作者介绍了如何通过测量空闲和阻塞时间来优化流处理程序的性能&#xff0c;并将这些内容同步至…...

探索编程世界的宝藏:程序员必掌握的20大算法

文章目录 1 引言2 冒泡排序算法&#xff1a;编程世界的排序魔法 &#x1f9d9;‍♀️&#x1f522;3 选择排序算法&#xff1a;排序世界的精确挑选器 &#x1f3af;&#x1f522;4 插入排序算法&#xff1a;排序世界的巧妙插珠者 ✨&#x1f522;5 快速排序算法&#xff1a;排序…...

Android NFC通信示例

前言 近距离无线通信 (NFC) 是一组近距离无线技术&#xff0c;通常只有在距离不超过 4 厘米时才能启动连接。借助 NFC&#xff0c;您可以在 NFC 标签与 Android 设备之间或者两台 Android 设备之间共享小型负载。 支持 NFC 的 Android 设备同时支持以下三种主要操作模式&…...

2023年08月IDE流行度最新排名

点击查看最新IDE流行度最新排名&#xff08;每月更新&#xff09; 2023年08月IDE流行度最新排名 顶级IDE排名是通过分析在谷歌上搜索IDE下载页面的频率而创建的 一个IDE被搜索的次数越多&#xff0c;这个IDE就被认为越受欢迎。原始数据来自谷歌Trends 如果您相信集体智慧&am…...

使用Beego和MySQL实现帖子和评论的应用,并进行接口测试(附源码和代码深度剖析)

文章目录 小项目介绍源码分析main.gorouter.gomodels/user.gomodels/Post.gomodels/comment.gocontrollers/post.gocontrollers/comment.go 接口测试测试增加帖子测试查看帖子测试增加评论测试查看评论 小项目介绍 经过对需求的分析&#xff0c;我增加了一些额外的东西&#x…...

物联网潜在的巨大价值在于大数据分析

物联网潜在的巨大价值在于大数据分析 从数据里去挖掘市场或者用户的精准需求。 往小的说&#xff0c;后台可以统计用户家里各各插座一年甚至更久的用电情况&#xff0c;这些数据也可以通过app或者小程序展现给用户。 用户可以很直观看到自己一年的用电情况&#xff0c;哪个家…...

SSL原理详解

SSL协议结构&#xff1a; SSL协议分为两层&#xff0c;下层为SSL记录协议&#xff0c;上层为SSL握手协议、SSL密码变化协议和SSL警告协议。 1.下层为SSL记录协议&#xff0c;主要作用是为高层协议提供基本的安全服务 建立在可靠的传输之上&#xff0c;负责对上层的数据进行分块…...

linux下的etc目录代表什么意思

在Linux系统中&#xff0c;/etc目录是一个非常重要的目录&#xff0c;它包含了系统的配置文件和相关的配置信息。下面是一些/etc目录中常见的文件和目录&#xff1a; 1. /etc/passwd&#xff1a;此文件包含了所有用户账户的信息&#xff0c;包括用户名、用户ID、用户所属的组I…...

iOS 两种方式设置状态栏

1、ios9.0以前设置状态栏字体颜色 ///白色 [[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent]; ///黑色 [[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleDefault]; 会看到如下提示&#xff1a; setStatusBarSty…...

html5:webSocket 基础使用

一、理解 HTML5 WebSocket HTML5 WebSocket是一种新型的网络协议&#xff0c;它能够在客户端和服务器之间建立实时的双向通信通道&#xff0c;使得浏览器和服务器之间的数据传输更加高效、快速和可靠。相比传统的HTTP协议&#xff0c;WebSocket协议使用更少的网络开销&#xf…...

html学习10-----总结(完)

<!DOCTYPE html> <html><head><meta charset"utf-8"/><title>html总结</title></head><body><h1>HTML总结</h1><br/><h2>文本格式化</h2><hr/><p><b>粗体文本<…...

Spring使用P命名空间实现注入数值信息-----Spring框架

<?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:p"http://www.springframework.org/schema/p"x…...

windows环境下安装RabbitMQ

一、RabbitMq简介1.1消息队列中间件简介消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用耦合&#xff0c;异步消息&#xff0c;流量削锋等问题实现高性能&#xff0c;高可用&#xff0c;可伸缩和最终一致性[架构] 使用较多的消息队列有 ActiveMQ(安全)&#x…...

Java源码规则引擎:jvs-rules决策流的自定义权限控制

规则引擎用于管理和执行业务规则。它提供了一个中央化的机制来定义、管理和执行业务规则&#xff0c;以便根据特定条件自动化决策和行为。规则引擎的核心概念是规则。规则由条件和动作组成。条件定义了规则适用的特定情况或规则触发的条件&#xff0c;而动作定义了规则满足时要…...

Python-字符串的世界

Python字符串的世界 在Python编程中&#xff0c;字符串&#xff08;String&#xff09;是一种非常重要的数据类型&#xff0c;用于表示文本信息。字符串可以包含字母、数字、特殊字符以及空格&#xff0c;它们在编程中被广泛用于文本处理、格式化输出、字符串匹配等各种场景。…...

使用上 Spring 的事件机制

本文主要是简单的讲述了Spring的事件机制&#xff0c;基本概念&#xff0c;讲述了事件机制的三要素事件、事件发布、事件监听器。如何实现一个事件机制&#xff0c;应用的场景&#xff0c;搭配Async注解实现异步的操作等等。希望对大家有所帮助。 Spring的事件机制的基本概念 …...

Linux安装QT

//进入qt安装包路径 cd qt安装包路径 //修改权限 sudo chmod x qt-opensource-linux-x64-5.14.2.run //运行qt安装包 sudo ./qt-opensource-linux-x64-5.14.2.run //安装编译器 sudo apt-get install gcc g //安装编译工具 sudo apt-get install build-essential //安装Op…...

电子书怎么转TXT?这4个电子书转TXT工具亲测有效,小白也能秒会!

随着数字阅读的普及&#xff0c;EPUB格式电子书因排版精美深受用户喜爱&#xff0c;但在编辑、手机阅读或跨设备分享时&#xff0c;TXT格式的兼容性和灵活性更具优势。本文针对不同使用场景&#xff0c;整理了4种亲测有效的EPUB转TXT方法&#xff0c;每个方法均拆解详细步骤&am…...

【AI原生研发成本优化黄金法则】:20年架构师亲授7大可落地降本策略,93%团队未用过第5招?

第一章&#xff1a;AI原生研发成本优化的底层逻辑与认知重构 2026奇点智能技术大会(https://ml-summit.org) AI原生研发并非传统软件工程的简单延伸&#xff0c;其成本结构由模型训练、推理服务、数据闭环、可观测性及持续演进五大动态耦合要素共同决定。忽视这一系统性特征&…...

别再下错包了!手把手教你获取ROS2 Humble可用的gazebo_grasp_plugin正确分支

ROS2 Humble版gazebo_grasp_plugin获取指南&#xff1a;避开新手三大陷阱 刚接触机械臂抓取仿真的开发者&#xff0c;往往在第一步获取资源时就栽了跟头。上周帮学弟调试机械臂项目时&#xff0c;发现他花了两天时间编译的gazebo_grasp_plugin始终报错——原因竟是下载了错误的…...

用Python+海康MV-CH120-60UM相机实现条形码识别,从硬件连接到代码调试的完整避坑指南

Python海康MV-CH120-60UM工业相机条形码识别实战&#xff1a;从硬件配置到智能解码的完整解决方案 工业视觉领域的开发者们常常面临一个现实问题&#xff1a;如何快速将硬件设备与软件系统无缝对接&#xff1f;本文将以海康威视MV-CH120-60UM工业相机为例&#xff0c;手把手带你…...

终极微博备份工具:一键将社交媒体内容导出为PDF文件

终极微博备份工具&#xff1a;一键将社交媒体内容导出为PDF文件 【免费下载链接】Speechless 把新浪微博的内容&#xff0c;导出成 PDF 文件进行备份的 Chrome Extension。 项目地址: https://gitcode.com/gh_mirrors/sp/Speechless 在数字时代&#xff0c;微博已成为我…...

孤立森林(Isolation Forest)在金融风控中的实战应用

1. 金融风控中的异常检测挑战 金融行业每天都要处理海量的交易数据&#xff0c;如何从中快速准确地识别出异常行为一直是风控系统的核心难题。传统的规则引擎虽然直观易懂&#xff0c;但面对日益复杂的欺诈手段往往力不从心。我曾经参与过一个信用卡反欺诈项目&#xff0c;最初…...

Windows任务栏定制神器:7+ Taskbar Tweaker让你的桌面效率翻倍

Windows任务栏定制神器&#xff1a;7 Taskbar Tweaker让你的桌面效率翻倍 【免费下载链接】7-Taskbar-Tweaker A Windows taskbar customization tool for Windows 7, Windows 8, and Windows 10 项目地址: https://gitcode.com/gh_mirrors/7t/7-Taskbar-Tweaker 你是否…...

STM32F407 IAP升级实战:从串口接收bin文件到安全跳转的完整流程(含代码解析)

STM32F407 IAP升级实战&#xff1a;从串口接收bin文件到安全跳转的完整流程&#xff08;含代码解析&#xff09; 在嵌入式系统开发中&#xff0c;IAP&#xff08;In-Application Programming&#xff09;技术是实现设备固件远程更新的重要手段。对于STM32F407这类资源丰富的MCU…...

从零构建PINN:基于PyTorch的Burgers方程求解实战

1. 初识PINN与Burgers方程 物理信息神经网络&#xff08;PINN&#xff09;这两年越来越火&#xff0c;它巧妙地将物理定律直接嵌入到神经网络训练过程中。我第一次接触这个概念时&#xff0c;感觉就像发现了新大陆——原来神经网络不仅能处理数据&#xff0c;还能直接求解偏微…...

2025物联网通信毕业设计:聚焦LoRa与ZigBee的智慧农业创新应用

1. 为什么选择LoRa与ZigBee做智慧农业&#xff1f; 最近几年帮学生指导毕业设计时&#xff0c;发现越来越多的同学开始关注智慧农业这个方向。说实话&#xff0c;这个选题确实很值得做——既能结合当下热门的物联网技术&#xff0c;又能解决实际农业生产中的痛点。在众多无线通…...