面试宝典:深入分析golang 的 泛型

news/2024/6/16 10:33:29/文章来源:https://blog.csdn.net/weixin_39801169/article/details/137174732

Go 语言在 1.18 版本中引入了泛型(Generics),这是一个允许开发者编写一次代码就能处理多种数据类型的特性。泛型的出现极大地增强了 Go 语言的表达能力和代码复用性,同时也保持了类型安全性。

泛型的概念

泛型是一种编写代码的方式,允许在编译时指定类型参数,而不是在运行时。这意味着使用泛型编写的函数或类型可以在任何类型上工作,只要这些类型满足某些约束条件。泛型的核心优势在于代码复用和类型安全。

泛型的好处

  1. 代码复用
    通过使用泛型,可以编写一个函数或类型,它能够适用于多种数据类型,而不需要为每种数据类型编写重复的代码。这减少了代码的冗余,提高了开发效率。

  2. 类型安全
    泛型在编译时检查类型参数是否满足定义的约束条件,这保证了类型安全,避免了运行时的类型错误。

  3. 更好的编译时错误检查
    泛型使得编译器能够在编译时捕获更多潜在的错误,因为泛型的类型参数和约束条件会在编译阶段进行检查。

  4. 更清晰的代码
    泛型提供了一种声明性的编写方式,使得代码更加简洁和易于理解。它避免了类型转换和断言的需要,从而使得代码更加清晰。

泛型的基本用法

泛型在 Go 语言中的使用主要体现在函数、类型和接口的定义中。以下是一个简单的泛型函数示例:

package mainimport "fmt"// 定义一个泛型函数 Swap,它接受两个相同类型的参数,并交换它们的值
func Swap[T any](a, b *T) {*a, *b = *b, *a
}func main() {x, y := 1, 2Swap(&x, &y)fmt.Println(x, y) // 输出:2 1s, t := "hello", "world"Swap(&s, &t)fmt.Println(s, t) // 输出:world hello
}

在这个例子中,Swap 函数是泛型的,它接受两个类型为 T 的指针参数,并交换它们的值。T 是一个类型参数,它被约束为 any,这意味着它可以是任何类型。

泛型的约束

泛型的类型参数可以有约束,这些约束定义了类型参数必须满足的条件。例如,你可以要求类型参数必须实现某个接口。以下是一个使用约束的泛型函数示例:

package mainimport "fmt"// 定义一个泛型函数 Print,它接受一个实现了 io.Stringer 接口的类型参数,并打印它的字符串表示
func Print[T any](t T) {fmt.Println(t.String())
}type MyString struct {s string
}func (ms *MyString) String() string {return ms.s
}func main() {Print("hello") // 使用标准库的 string 类型Print(&MyString{s: "world"}) // 使用自定义的 MyString 类型
}

在这个例子中,Print 函数是泛型的,它接受一个类型参数 T,该类型参数必须是 any 类型,并且 Print 函数使用 String 方法打印类型参数的字符串表示。MyString 类型实现了 io.Stringer 接口,因此它可以作为 Print 函数的参数。

结论

泛型是 Go 语言中一个非常重要的特性,它提高了代码的复用性和可读性,同时保持了类型安全性。泛型的引入使得 Go 语言在处理多种数据类型时更加灵活和强大。开发者应该充分利用泛型来编写更加通用和健壮的代码。然而,泛型也带来了更复杂的类型系统,可能会增加学习和理解的难度,因此在使用时需要仔细考虑其设计和实现。

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

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

相关文章

生成式人工智能的现状:我们对 3,000 多名技术领导者进行的全球调查

作者:来自 Elastic Madge Miller Elastic 生成人工智能报告着眼于组织如何采用生成人工智能。 我们很高兴地宣布发布《Elastic 生成人工智能报告》,该报告揭示了全球早期生成人工智能实施的期望和挑战。 该报告与 Vanson Bourne 合作制作,汇…

新增收货地址

目录 🧂1.创建controller层 🥓2.创建service层 🌭3.注意细节 🍿4.避免dao数据暴漏 1.创建controller层 controller不做逻辑操作,只接受前端的数据 1.添加Api设置swagger模块名称2.RestController以json形式返回…

让linux系统时间与(windows)服务器同步操作说明

1将windows服务器配置成NTP服务器 Regedit 改两个注册值,重启时间服务 启Win32Time服务执行如下命令: net stop w32time && net start w32time 2 linux板子操作说明 有两个事要处理 1(离线)安装同步工具nptdate并测试…

【Vue3源码学习】— CH2.5 reactiveEffect.ts:Vue 3响应式系统的核心

reactiveEffect.ts:Vue 3响应式系统的核心 1. 什么是 reactiveEffect?2. 核心机制2.1 依赖收集(Track)2.2 触发更新(Trigger)2.3 效果范围(effectScope) 3. 源码解析 —— track3.1 …

微信小程序被删除的文件一编译又回来了

一开始创建错了位置,就想着删除文件重新创建,但是没想到每次重新编译的时候,之前被删除的js、wsml文件就又回来了,后来发现是我在app.json中的pages里面的代码没有被删除。 因为我最开始创建错了,快捷创建了页面&#…

【LeetCode热题100】79. 单词搜索(回溯)

一.题目要求 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平…

currentServerAddr:http://localhost:8848, err : connect timed out

场景复现: 一:原配置文件application.yml spring:cloud:nacos:config:server-addr: ${cas-wict-nacos-url}namespace: ${cas-wict-nacos-namespace}shared-configs:- data-id: mysql.propertiesrefresh: true- data-id: mysql.propertiesrefresh: true…

C++项目——集群聊天服务器项目(九)客户端异常退出业务

服务器端应检测到客户端是否异常退出,因此本节来实现客户端异常退出,项目流程见后文 一、客户端异常退出业务流程 (1)在业务模块定义处理客户端异常退出的函数 (2)集群聊天服务器项目(八)提到…

Linux(CentOS7)安装 MongoDB

目录 下载 上传 解压 创建mongodb.conf 创建数据文件夹和日志文件夹 启动服务 创建软链接 安装客户端 下载 上传 安装 下载 官方地址: Download MongoDB Community Server | MongoDBhttps://www.mongodb.com/try/download/community 上传 将下载好的 …

跨境运营必看:TikTok账号防封指南

多人在使用TikTok的过程中都会遇到一些问题,比如为什么TikTok没有浏览量?事实上,这很可能是因为你的账号已被禁止。但为什么它会被封呢?你怎样才能解决它? 一、TikTok账号为什么被封? 1、什么是 TikTok 影…

输油管道变电所运维系统发展趋势

摘要:随着现代化技术以及信息化手段的飞速发展,社会已经进入到了全新的发展阶段,这也为自动化技术的发展起到了良好的促进作用,特别是在目前输油管道电网快速发展的背景下,传统的输油管道变电站管理模式与管理系统&…

Scrapy爬虫的打包Auto-py-to-exe/Pyinstall

Scrapy爬虫打包成可执行文件 前言步骤Scrapy代码部分auto-py-to-exe部分1. 安装2. 配置 前言 朋友托了我写了个小爬虫,然后写成之后老是要在我这儿跑,交付不了给朋友。项目太小,也不好用scrapyd托管在服务器。找了找有pyinstall和Auto-py-to…

C++语言学习(二)——⭐缺省参数、函数重载、引用

1.⭐缺省参数 &#xff08;1&#xff09;缺省参数概念 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时&#xff0c;如果没有指定实参则采用该形参的缺省值&#xff0c;否则使用指定的实参。 void Func(int a 0) {cout<<a<<endl; } int…

keepalived+LVS高可用部署

目录 一.两台设备&#xff08;2.130和2.133&#xff09;作为调度器&#xff0c;前主后备 1.部署keepalived 2.修改配置文件准备启动 3.配置keepalived的系统日志并启动 二.模拟调度器掉点和web服务进程丢失 1.调度器掉点 2.当类似于httpd这种网站服务掉点 三.以三种健康…

简单了解观察者模式(发布 - 订阅模式)

什么是观察者模式&#xff1f; 观察者根据主题类的内部状态变化来改变自身状态&#xff0c;简单来说就是观察者订阅了主题类&#xff0c;当主题类发布一些消息&#xff0c;观察者就会收到消息&#xff0c;然后做出反应。 Spring的观察者模式 Spring用了监听器&#xff08;观察…

时序数据库IoTDB:功能详解与行业应用

一文读懂时序数据库 IoTDB。 01 为什么需要时序数据库 解释时序数据库前&#xff0c;先了解一下何谓时序数据。 时序数据&#xff0c;也称为时间序列数据&#xff0c;是指按时间顺序记录的同一统计指标的数据集合。这类数据的来源主要是能源、工程、交通等工业物联网强关联行业…

数据可视化高级技术(Echarts)

目录 &#xff08;一&#xff09;数据可视化概念及Echarts基础知识 数据可视化的好处&#xff1a; 数据可视化的目标 数据可视化的基本流程 &#xff08;二&#xff09;数据图表 类别比较图表&#xff1a; 数据关系图表&#xff1a; 数据分布图表&#xff1a; 时间序列…

ETL中如何自定义规则

一、ETL中的规则 在使用规则之前我们先来了解一下什么是规则&#xff0c;ETL中规则在很多组件中都能看见&#xff0c;可以理解为按照事前约定好的逻辑去执行&#xff0c;规则可以使得数据更加的规范统一&#xff0c;同时也不需要去纵向的修改底层代码&#xff0c;只需要动态编…

机器学习模型及其使用方法——《机器学习图解》

本书教你两件事——机器学习模型及其使用方法 机器学习模型有不同的类型&#xff0c;有些返回确定性的答案&#xff0c;例如是或否&#xff0c;而另一些返回概率性的答案。有些以问题的形式呈现&#xff1b;其他则使用假设性表达。这些类型的一个共同点是它们都返回一个答案或…

成都市酷客焕学新媒体科技有限公司:实现品牌的更大价值!

成都市酷客焕学新媒体科技有限公司专注于短视频营销&#xff0c;深知短视频在社交媒体中的巨大影响力。该公司巧妙地将品牌信息融入富有创意和趣味性的内容中&#xff0c;使观众在轻松愉悦的氛围中接受并传播这些信息。凭借独特的创意和精准的营销策略&#xff0c;成都市酷客焕…