Golang面试:泛型

news/2024/7/5 20:36:41/文章来源:https://www.cnblogs.com/lianshuiwuyi/p/18281667

Go语言在1.18版本中引入了泛型(Generics),这是Go语言发展中的一个重要里程碑。泛型允许你编写更通用和可复用的代码,而无需牺牲类型安全性。以下是对Go中泛型的详细介绍,包括其语法、使用场景和示例代码。

1. 泛型的基本概念

泛型允许你定义可以处理多种数据类型的函数和数据结构,而无需为每种类型编写单独的代码。通过使用类型参数,你可以编写一次代码,然后在不同的上下文中重用它。

2. 类型参数

类型参数是泛型的核心。你可以在函数、结构体和接口中使用类型参数。类型参数在声明时使用方括号[]括起来,并且可以有一个或多个类型参数。

3. 类型约束

类型约束用于限制类型参数可以接受的类型。Go提供了几种类型约束:

  • any:表示任意类型。
  • comparable:表示可以进行比较的类型(支持==!=操作)。
  • 可以定义自定义类型约束:
package mainimport "fmt"// 定义一个自定义类型约束
type Number interface {int | float64
}// 使用自定义类型约束的泛型函数
func Add[T Number](a, b T) T {return a + b
}func main() {fmt.Println(Add(1, 2))       // 输出: 3fmt.Println(Add(1.5, 2.3))   // 输出: 3.8
}

在这个示例中,Number接口定义了一个自定义类型约束,表示intfloat64类型。

4. 泛型的使用场景

泛型在以下场景中特别有用:

  • 集合操作:例如,处理不同类型的列表、集合和映射。
  • 算法实现:例如,排序、搜索和数学运算。
  • 数据结构:例如,栈、队列和树。
  • 通用库:例如,通用的工具函数和数据处理库。

5. 注意事项

  • 性能:泛型可能会引入一些性能开销,特别是在编译时和运行时的类型检查和转换。
  • 复杂性:泛型代码可能会增加代码的复杂性,特别是在类型约束和类型参数的使用上。

6. 示例

创建一个泛型函数,该函数可以接受任何类型的map并返回其键的列表。为了实现这一点,我们需要定义一个泛型类型参数来表示map的键和值的类型。

package mainimport ("fmt"
)// GetKeys 返回给定 map 的所有键的切片
func GetKeys[K comparable, V any](m map[K]V) []K {keys := make([]K, 0, len(m))for k := range m {keys = append(keys, k)}return keys
}func main() {// 示例 1:map[string]intmap1 := map[string]int{"one": 1,"two": 2,"three": 3,}keys1 := GetKeys(map1)fmt.Println("Keys of map1:", keys1)// 示例 2:map[int]stringmap2 := map[int]string{1: "one",2: "two",3: "three",}keys2 := GetKeys(map2)fmt.Println("Keys of map2:", keys2)// 示例 3:map[float64]boolmap3 := map[float64]bool{1.1: true,2.2: false,3.3: true,}keys3 := GetKeys(map3)fmt.Println("Keys of map3:", keys3)
}

说明

  1. 定义泛型函数
    • 函数GetKeys使用两个类型参数KV,其中K表示map的键类型,V表示map的值类型。
    • K需要实现comparable接口,因为map的键必须是可比较的。
    • V可以是任何类型,因此使用any作为类型约束。
  2. 获取键列表
    • 函数中,创建一个切片keys用于存储map的键。
    • 通过遍历map,将每个键添加到keys切片中。
    • 最后返回keys切片。
  3. 示例用法
    • main函数中,定义了三个不同类型的map,并调用GetKeys函数获取它们的键列表。
    • 打印每个map的键列表以验证结果。

孟斯特

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意
腾讯云开发者社区:孟斯特


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

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

相关文章

【算法】KD-tree

1. 算法简介 KD-tree(K-Dimensional),是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构。 主要应用于多维空间关键数据的搜索。 KD-tree 的本质是一棵平衡树,将空间内的区域划分为一个超长方体,然后存储为节点进行维护。 以下为一个 \(k=2\) 时的 KD…

性能测试:主流性能监控工具介绍

行业流行性能监控工具有哪些Linux 自带命令 Vmstat,Top 等 Nmon Collectd + InfluxDB + Grafana Prometheus + Grafana行业流行性能监控工具的介绍 Linux 自带命令 Vmstat,Top 等 vmstat 和 top 都是 Linux 系统自带的命令,提供了实时的监控信息,对于系统管理员和开发人员来…

BTC交易流程

交易流程 比特币的交易流程涉及多个步骤和参与方,包括发送方、接收方、矿工和比特币网络中的节点。以下是比特币交易的详细流程:创建交易:生成比特币地址:比特币地址是一个由公钥生成的字符串,用于接收比特币。每个用户在创建比特币钱包时,都会生成一对公钥和私钥。公钥通…

技术手段和测试流程,不是一回事

看到这样一个问题:造测试数据时,如果失败了怎么办,如何处理这种失败的情况?失败了需要停止测试活动吗? 很久没看到这么有意思的问题了,毕竟测试数据是很重要的测试活动开展资料,如果缺失或者不准确,会对测试结果造成极大的影响。那么该如何理解和解决上述的问题呢?我们…

PaddleNLP UIE -- 药品说明书信息抽取(名称、规格、用法、用量)

目录创建项目环境配置上传代码训练定制代码结构数据标注准备语料库数据标注导出数据数据转换doccanoLabel Studio模型微调模型评估定制模型一键预测效果 PaddleNLP UIE 实体关系抽取 -- 抽取药品说明书(名称、规格、用法、用量) 对于细分场景推荐使用轻定制功能(标注少量数据…

VMware vSphere Tanzu部署_03_vCenter部署

vCenter部署 部署vCenter通过安装ISO内的webui工具进行vCenter虚机部署配置部署位置为ESXI机器配置部署规格为tiny模式配置vcsa部署的磁盘类型为精简模式配置vcsa的网络初始化vCenter配置vcsa开启ntp同步和开启SSH登录配置vsphere登录账号和登录域调整vCenter内存大小在esxi中将…

05-Excel初阶操作-学习笔记

本期继续更新函数专题DATE函数 函数格式:DATE(参数1,参数2,参数3) 参数说明:参数1:年份;参数2:月份;参数3:日 作用:将文本类型转换为正确的日期格式 应用场景:身份证号提取出生日期其中,MID()是文本截取函数 注意!如果输入2000-2-30使用date函数后会进行进位显示2000…

OpenBMB Hugging Face THUNLP,大模型课开班丨伙伴活动推荐

2022 年,OpenBMB 开源社区联合 THUNLP 开国内大模型公开课先河,全网百万级播放量,已帮助无数大模型爱好者从入门到精通。这个夏天,OpenBMB 携手 HuggingFace、THUNLP 和面壁智能,推出大模型公开课第二季。全球知名开源社区 OpenBMB Hugging Face 梦幻联动,MiniCPM、Chat…

【Unity】HoloLens2 开发日记

2022/1/12 第一天! START ! 配置环境微软官方教程:练习 - 导入和配置资源 - Learn | Microsoft DocsWindows 10 SDK 地址:Windows SDK - Windows 应用开发 (microsoft.com)MRTK(混合现实工具包):Download Mixed Reality Feature Tool from Official Microsoft Download C…

深度学习--模型优化--模型的量化--92

目录1. 什么是量化2 位宽,高精度浮点数的表示3. K-means 聚类量化4. 均匀/线性量化(linear quantization)5. Thresholding量化 1. 什么是量化 量化可以理解为:从连续到离散,针对parameters(W)、activations(A)使用整数值取代浮点数值, 模型尺寸更小 改进inference时间…

Profibus DP主站转Modbus网关连接伺服与电机通讯

文章介绍了ProfibusDP主站转Modbus网关(XD-MDPBM20)在工业自动化中的应用,包括其定义、优势及连接伺服与电机通讯的步骤。Profibus DP主站转Modbus网关(XD-MDPBM20)是一种用于不同通讯协议之间转换的设备,它可以将Profibus DP主站的信号转换为Modbus协议,实现不同设备之…

Power BI实用技巧:轻松打造专业级甘特图

Power BI实用技巧:轻松打造专业级甘特图大家好,今天我们要一起探索Power BI中一个既实用又强大的功能——制作甘特图。甘特图以其直观展示项目时间线和任务进度的特点,在项目管理中扮演着重要角色,今天将为大家带来两种不同的甘特图制作方式——堆积条形甘特图、第三方视觉…

docker相关配置

避免 Docker Hub 限制,最好配置镜像 配置文件:/lib/systemd/system/docker.service 把文件里ExecStart=/usr/bin/dockerd-current替换成ExecStart=/usr/bin/dockerd-current --registry-mirror=https://a14c78qe.mirror.aliyuncs.com即可 配置成功后可查看docker运行状态:sy…

Power BI进阶秘籍,干货满满!如何将度量值转化为切片器(动态切换分析指标),实操指南来了!

Power BI进阶秘籍,干货满满!如何将度量值转化为切片器(动态切换分析指标),实操指南来了!想要在Power BI中让度量值也能像维度一样灵活筛选?没问题,这里就为你揭秘如何将度量值转化为切片器(动态切换分析指标)的实用方法!一、了解基础:首先,要知道Power BI原生不支…

SD中的VAE,你不能不懂

要想生成一幅美丽的图片,没有VAE可不行什么是VAE? VAE,即变分自编码器(Variational Autoencoder),是一种生成模型,它通过学习输入数据的潜在表示来重构输入数据。 在Stable Diffusion 1.4 或 1.5 模型中,通过VAE对模型进行部分更新,以提升模型渲染眼睛的能力。通过这种…

VSCODE 编辑markdown 文件

因为Obsidian版权问题,改用vscode编辑器 编辑markdown 文件 1.使用VSCODE 编辑markdown 文件 首先分别下载 Markdown 和markdown PDF 第三方插件 2.保存文件为md 格式,如果需要缓存图片,可以点击右上角的预览模块。就可以看图片了(window 和linux 服务器都是/ 分隔符) 如…

如何从服务器bios清除磁盘数据

解决问题并查找根源: 一、服务空间不足,服务无法部署或服务不可用 二、清理了大日志文件,但是空间还是不足 1.首先是通过df -h命令查看磁盘的使用情况,主演是看Avail(可用)和Use(已用)的占用百分比,如下所示: df -h Filesystem Size Used Avail Use% Mounted on /dev/m…

《安富莱嵌入式周报》第339期:单片机运行苹果早期Mac系统模拟器,2GHz示波器有源探头,下一代矩阵开关面包板,卡片式声音分贝器,HP经典示波器,ReRAM

周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104 视频版 https://www.bilibili.com/video/BV1Kf421Q7Lh目录1、开源2GHz的示波器有源探头 2、模拟矩阵开关面包板Jumperless推出下一代Jumperless V5 3、软件相关…

IBM服务器SQL/ Oracle数据库修复

一、故障诊断: 1.使用IBM服务器管理工具(如IBM Storage Manager)连接到服务器,检查当前存储状态和数据库状态。 2.查看错误日志和系统日志,确定数据库损坏的具体原因,如硬盘故障、RAID阵列崩溃、文件系统损坏等。 风险评估: 1.评估数据库损坏的严重程度和恢复的可能性。…

对vue3中update:属性的理解

最近看到了一个项目中代码,类似于update:count。 对此不太明白用法,这里经过理解之后,记录一下。 大概是这样的这里的场景是父组件中引入了子组件,在父组件中有一个变量count,并将count传入到了子组件。 现在假设父组件上有个按钮,其作用是每次按下,就对父组件中的count…