Golang面试:泛型
1.iota简介2.go generate命令简介3.golang uuid库介绍4.gRPC基本教程5.protolator简介6.Govulncheck v1.0.0 发布了!7.每日一库:GORM简介8.Go泛型简介9.Go 1.21发布!10.Golang zip压缩文件读写操作11.本地搭建playground12.zap自定义日志级别13.Gorm日志设置14.gin启动https支持15.Go Plugin介绍16.Golang漏洞管理17.可以丢掉123456了18.如何优雅地退出程序19.PGO前瞻20.go多版本管理21.openAI发布v0.2.0了22.Gin中间件开发23.Fabric区块链浏览器(1)24.每日一库:Memcache25.protojson简介26.每日一库:gosec27.Fabric区块链浏览器(2)28.每日一库:fsnotify简介29.gRPC with JWT30.embed简介31.Fabric区块链浏览器(3)32.每日一库:pprof简介33.go 1.21:cmp34.完全可复制、经过验证的 Go 工具链35.PGO in Go 1.2136.Fabric 2.x 智能合约开发记录37.为不断增长的Go生态系统扩展gopls38.每日一库:lumberjack -- 日志轮换和管理39.2023-04-26-微信安全模式下消息解析40.WASI support in Go41.每日一库:Prometheus42.如何实现流量控制和熔断降级?43.消息队列 - RabbitMQ44.Go 1.22 中的 For 循环45.设计模式之单例模式46.每日一库:使用Viper处理Go应用程序的配置47.使用 gopkg.in/yaml.v3 解析 YAML 数据48.在Go中如何实现并发49.解析类型参数50.设计模式之工厂模式51.每日一库:cobra 简介52.slices in Go 1.2153.go defer简介54.slice简介55.Golang Map底层实现简述56.Go 如何实现多态57.查找数组中第K大的元素58.go中的内存逃逸59.数组 vs. 切片60.队列(Queue):先进先出(FIFO)的数据结构61.go 中如何实现定时任务62.go 中的循环依赖63.Go中字符串处理:fmt.Sprintf与string.Builder的比较64.理解Go中的零值65.go 上下文:context.Context66.go中异常处理流程67.Go实现网络代理68.Why gRPC ?69.Go:条件控制语句70.Go 获取 IP 地址71.Golang并发控制方式有几种?
72.Golang面试:泛型
73.LRU算法简介74.MRU算法实现75.ARC算法实现76.Go语言中的交互式CLI开发:survey库简介77.C如何调用GoGo语言在1.18版本中引入了泛型(Generics),这是Go语言发展中的一个重要里程碑。泛型允许你编写更通用和可复用的代码,而无需牺牲类型安全性。以下是对Go中泛型的详细介绍,包括其语法、使用场景和示例代码。
1. 泛型的基本概念
泛型允许你定义可以处理多种数据类型的函数和数据结构,而无需为每种类型编写单独的代码。通过使用类型参数,你可以编写一次代码,然后在不同的上下文中重用它。
2. 类型参数
类型参数是泛型的核心。你可以在函数、结构体和接口中使用类型参数。类型参数在声明时使用方括号[]
括起来,并且可以有一个或多个类型参数。
3. 类型约束
类型约束用于限制类型参数可以接受的类型。Go提供了几种类型约束:
any
:表示任意类型。comparable
:表示可以进行比较的类型(支持==
和!=
操作)。- 可以定义自定义类型约束:
package main import "fmt" // 定义一个自定义类型约束 type Number interface { int | float64 } // 使用自定义类型约束的泛型函数 func Add[T Number](a, b T) T { return a + b } func main() { fmt.Println(Add(1, 2)) // 输出: 3 fmt.Println(Add(1.5, 2.3)) // 输出: 3.8 }
在这个示例中,Number
接口定义了一个自定义类型约束,表示int
或float64
类型。
4. 泛型的使用场景
泛型在以下场景中特别有用:
- 集合操作:例如,处理不同类型的列表、集合和映射。
- 算法实现:例如,排序、搜索和数学运算。
- 数据结构:例如,栈、队列和树。
- 通用库:例如,通用的工具函数和数据处理库。
5. 注意事项
- 性能:泛型可能会引入一些性能开销,特别是在编译时和运行时的类型检查和转换。
- 复杂性:泛型代码可能会增加代码的复杂性,特别是在类型约束和类型参数的使用上。
6. 示例
创建一个泛型函数,该函数可以接受任何类型的map
并返回其键的列表。为了实现这一点,我们需要定义一个泛型类型参数来表示map
的键和值的类型。
package main import ( "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]int map1 := map[string]int{ "one": 1, "two": 2, "three": 3, } keys1 := GetKeys(map1) fmt.Println("Keys of map1:", keys1) // 示例 2:map[int]string map2 := map[int]string{ 1: "one", 2: "two", 3: "three", } keys2 := GetKeys(map2) fmt.Println("Keys of map2:", keys2) // 示例 3:map[float64]bool map3 := map[float64]bool{ 1.1: true, 2.2: false, 3.3: true, } keys3 := GetKeys(map3) fmt.Println("Keys of map3:", keys3) }
说明:
- 定义泛型函数:
- 函数
GetKeys
使用两个类型参数K
和V
,其中K
表示map
的键类型,V
表示map
的值类型。 K
需要实现comparable
接口,因为map
的键必须是可比较的。V
可以是任何类型,因此使用any
作为类型约束。
- 函数
- 获取键列表:
- 函数中,创建一个切片
keys
用于存储map
的键。 - 通过遍历
map
,将每个键添加到keys
切片中。 - 最后返回
keys
切片。
- 函数中,创建一个切片
- 示例用法:
- 在
main
函数中,定义了三个不同类型的map
,并调用GetKeys
函数获取它们的键列表。 - 打印每个
map
的键列表以验证结果。
- 在

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意
腾讯云开发者社区:孟斯特
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体
2019-07-03 [PyTorch入门]之数据导入与处理