go语言泛型Generic最佳实践 --- slices包
在go的内置包slices中, 所有的函数函数都使用了泛型, 各种各样的泛型, 可以说这个包绝对是go语言泛型学习的最佳实践之一!
来,先来瞄一眼,看看这个slices包里面的函数原型定义:
func BinarySearch[S ~[]E, E cmp.Ordered](x S, target E) (int, bool)
func BinarySearchFunc[S ~[]E, E, T any](x S, target T, cmp func(E, T) int) (int, bool)
func Clip[S ~[]E, E any](s S) S
func Clone[S ~[]E, E any](s S) S
func Compact[S ~[]E, E comparable](s S) S
func CompactFunc[S ~[]E, E any](s S, eq func(E, E) bool) S
func Compare[S ~[]E, E cmp.Ordered](s1, s2 S) int
func CompareFunc[S1 ~[]E1, S2 ~[]E2, E1, E2 any](s1 S1, s2 S2, cmp func(E1, E2) int) int
func Concat[S ~[]E, E any](slices ...S) S
func Contains[S ~[]E, E comparable](s S, v E) bool
func ContainsFunc[S ~[]E, E any](s S, f func(E) bool) bool
func Delete[S ~[]E, E any](s S, i, j int) S
func DeleteFunc[S ~[]E, E any](s S, del func(E) bool) S
func Equal[S ~[]E, E comparable](s1, s2 S) bool
func EqualFunc[S1 ~[]E1, S2 ~[]E2, E1, E2 any](s1 S1, s2 S2, eq func(E1, E2) bool) bool
func Grow[S ~[]E, E any](s S, n int) S
func Index[S ~[]E, E comparable](s S, v E) int
func IndexFunc[S ~[]E, E any](s S, f func(E) bool) int
func Insert[S ~[]E, E any](s S, i int, v ...E) S
func IsSorted[S ~[]E, E cmp.Ordered](x S) bool
func IsSortedFunc[S ~[]E, E any](x S, cmp func(a, b E) int) bool
func Max[S ~[]E, E cmp.Ordered](x S) E
func MaxFunc[S ~[]E, E any](x S, cmp func(a, b E) int) E
func Min[S ~[]E, E cmp.Ordered](x S) E
func MinFunc[S ~[]E, E any](x S, cmp func(a, b E) int) E
func Replace[S ~[]E, E any](s S, i, j int, v ...E) S
func Reverse[S ~[]E, E any](s S)
func Sort[S ~[]E, E cmp.Ordered](x S)
func SortFunc[S ~[]E, E any](x S, cmp func(a, b E) int)
func SortStableFunc[S ~[]E, E any](x S, cmp func(a, b E) int)
怎么样,是不是全部都是清一色的泛型函数?
来,我们先拿第一个大名鼎鼎的二分查找函数来说说
func BinarySearch[S ~[]E, E cmp.Ordered](x S, target E) (int, bool)
这个函数里面定义了S E泛型约束 [S ~[]E, E cmp.Ordered] 这个的意思就是 参数S 的底层类型必须是切片E, 同时 E类型必须是已排序的切片。
分解:
S ~[]E 约束S类型的底层类型必须是E的切片
E cmp.Ordered 这个约束E的类型必须是已排序的类型, 这里的emp.Ordered是一个专门用来做参数类型约束的接口定义。
E cmp.Ordered接口定义如下:
type Ordered interface {~int | ~int8 | ~int16 | ~int32 | ~int64 |~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr |~float32 | ~float64 |~string
}
可见这个 cmp.Ordered 接口定义了他所能接收的参数类型列表,只要泛型约束里面使用了他, 那你的参数的类型就只能是这个里面定义的类型之一。
再来一个
func SortFunc[S ~[]E, E any](x S, cmp func(a, b E) int)
这个函数的泛型约束[S ~[]E, E any]里面 有一个 any , 这个在go语言里面表示任意类型, 他是一个类型定义,即 type any = interface{} , 其他和上一个的泛型约束类似。
另外一个需要说的就是 comparable 这个泛型约束, 这个也是一个类型定义,即 type comparable interface{ comparable } , comparable这个泛型约束是go语言的底层定义的一个约束接口,他约束数据类型必须是这些类型之一: booleans, numbers, strings, pointers, channels, 可比较类型的数组,所有字段是可比较类型的结构体
函数原型: func Index[S ~[]E, E comparable](s S, v E) int
示例代码:
package mainimport ("fmt""slices"
)func main() {numbers := []int{0, 42, 8}fmt.Println(slices.Index(numbers, 8))fmt.Println(slices.Index(numbers, 7))
}
参考:
slices package - slices - Go Packages
相关文章:
go语言泛型Generic最佳实践 --- slices包
在go的内置包slices中, 所有的函数函数都使用了泛型, 各种各样的泛型, 可以说这个包绝对是go语言泛型学习的最佳实践之一! 来,先来瞄一眼,看看这个slices包里面的函数原型定义: func BinarySe…...
【神经网络结构可视化】使用 Visualkeras 可视化 Keras / TensorFlow 神经网络结构
文章目录 Visualkeras介绍下载安装代码示例1、导入必要的库2、创建VGG16神经网络模型3、可视化神经网络结构4、完整代码5、使用教程 可视化自己创建的神经网络结构1、导入要的库2、创建自己的神经网络模型3、可视化神经网络结构图4、完整代码 Visualkeras介绍 Visualkeras是一…...
nvm安装nodejs/npm/nvm笔记
1 安装nvm, 指定路径nvm路径: D:\Program_Files\nvm\nvm指定路径nodejs 路径: D:\Program_Files\nvm\nodejs 2 进入nvm安装路径找到settings.xml文件,追加2行,设置镜像 node_mirror: https://npmmirror.com/mirrors/node/ npm_mirror: ht…...
微信小程序源码-基于Java后端的小区租拼车管理信息系统毕业设计(附源码+演示录像+LW)
大家好!我是程序员一帆,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:微信小程序毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设…...
嵌入式进阶——LED呼吸灯(PWM)
🎬 秋野酱:《个人主页》 🔥 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 PWM基础概念STC8H芯片PWMA应用PWM配置详解占空比 PWM基础概念 PWM全称是脉宽调制(Pulse Width Modulation)…...
一文读懂:http免费升级https
背景: 随着现在全民网络安全意识的日益提升,各个网站需要实现的https数量也随之提升,那么如何将原本网站的http访问方式升级为https呢? 该内容为如何免费将网站的http访问升级为https访问 论https的加密逻辑: 步骤 …...
算法刷题笔记 高精度除法(C++实现)
文章目录 题目描述求解思路实现代码 题目描述 给定两个非负整数(不含前导0)A,B,请你计算 A/B 的商和余数。 输入格式 共两行,第一行包含整数A,第二行包含整数B。 输出格式 共两行,第一行输…...
按月爬取天气数据可视化展示
从天气网分析,可以查询每个月的天气情况,这里按照url规则,传入年月,获取数据,最后进行可视化展示,最终效果: 下面是获取过程: 第一步: import requestsdef get_weather(month):url = f"https://lishi.tianqi.com/nanning/{month}.html"response = reques…...
VMware安装Ubuntu系统(超详细)
一.Ubuntu官网下载镜像 Ubuntu官网:Enterprise Open Source and Linux | Ubuntu 二.安装Ubuntu系统 选择文件->创建虚拟机新建虚拟机(ControlN),这里直接选择典型即可 选择稍后安装系统 选择linux Ubuntu 64位 填写虚拟机名称…...
数据清洗操作及众所周知【数据分析】
各位大佬好 ,这里是阿川的博客 , 祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 前面的博客 数据分析—技术栈和开发环境搭建 …...
炫酷gdb
在VS里面调试很方便对吧?(F5直接调试,F10逐过程调试--不进函数,F11逐语句调试--进函数,F9创建断点),那在Linux中怎么调试呢? 我们需要用到一个工具:gdb 我们知道VS中程…...
windows 7 10 11快捷键到启动页面
1.快速打开用户启动文件夹 shell:startup 方式2:快速打开系统启动文件夹 shell:Common Startup shell:Common Startup...
[处理器芯片]-6 超标量CPU实现之浮点运算
1 浮点运算单元FPU 超标量CPU中的浮点运算单元是专门处理浮点数运算的关键组件。浮点运算单元的设计涉及多个复杂的子模块和技术,以保证高效、准确地执行浮点数的加减法、乘法、除法、平方根等操作。 1)浮点数术语 浮点数通常采用IEEE 754标准表示&…...
又有人叫嚣:AI取代前端,来给你几张图,看能不能憋死AI。
总有自媒体人,为了些许流量,在大放厥词,说截个图给AI,AI就能输出前端代码,这是啥都敢说,吹牛不上税。 我来给你几张贝格前端工场日常接的大数据项目相关的图,你让AI生成代码,取代前…...
ISCC2024个人挑战赛WP-WEB
(非官方解,以下内容均互联网收集的信息和个人思路,仅供学习参考) 还没想好名字的塔防游戏 GET /world.js HTTP/1.1 Host: 101.200.138.180:17345 Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/avif,i…...
Android 使用 adb 列出设备上所有危险权限
步骤1:确定 Android SDK 位置 打开 Android Studio 的设置,并来到 Languages & Frameworks › Android SDK 处: 这里可以看到 Android SDK 目录的位置: 例如:/Users/admin/Library/Android/sdk。 复制这个路径&am…...
Spring AOP源码分析
#### AOP(面向切面编程)作用及其优势 作用:在程序运行期间,在不修改源码的情况下对方法进行功能增强(通知) 优势:减少重复代码,提高代码复用性,提高代码可维护性…...
[LLM]从GPT-4o原理到下一代人机交互技术
一 定义 GPT-4o作为OpenAI推出的一款多模态大型语言模型,代表了这一交互技术的重要发展方向。 GPT-4o是OpenAI推出的最新旗舰级人工智能模型,它是GPT系列的一个重要升级,其中的"o"代表"Omni",中文意思是“全…...
【Spring】AOP——通知(Advice)
1、通知(Advice) 1.1简介 在AOP中,通知(Advice)是切面(Aspect)中的一部分,用于定义在连接点(Joinpoint)处应该执行的操作。通知类型可以在AOP框架中配置和使…...
python中的一些基础概念
在python中整型数据可以和浮点型数据相加,在python中字符串数据可以进行相加, 在python中整型数据可以和布尔类型进行算术运算。此时True当做1,False当做0但是这样的操作是没有意义的, python中只有字符串类型没有字符类型&…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
9-Oracle 23 ai Vector Search 特性 知识准备
很多小伙伴是不是参加了 免费认证课程(限时至2025/5/15) Oracle AI Vector Search 1Z0-184-25考试,都顺利拿到certified了没。 各行各业的AI 大模型的到来,传统的数据库中的SQL还能不能打,结构化和非结构的话数据如何和…...
