Go: 利用泛型提升代码重用性, 实用示例详解
创作时间:
2025-03-12 15:15:19
作者:
@小白创作中心
Go: 利用泛型提升代码重用性, 实用示例详解
引用
CSDN
1.
https://blog.csdn.net/qq_14829643/article/details/138293446
泛型是现代编程中实现代码重用的一种强大工具,特别是在处理不同数据类型但需要执行相似操作的场景中。通过定义泛型函数或类型,开发者可以写出既灵活又可维护的代码,同时减少重复代码的需要。在Go语言中,泛型的引入允许对各种数据类型执行相同的逻辑,而无需为每种数据类型编写单独的函数或数据结构。下面通过一些例子,详细解释泛型如何在Go中实现代码重用。
示例1:泛型切片过滤器
假设我们需要一个功能,从切片中过滤出符合特定条件的元素。在没有泛型的情况下,我们可能需要为整型切片、字符串切片等编写不同的过滤函数。但是有了泛型,我们只需编写一次过滤逻辑即可。
package main
import "fmt"
// Filter 是一个泛型函数,可以处理任何类型的切片
func Filter[T any](slice []T, fn func(T) bool) []T {
var result []T
for _, value := range slice {
if fn(value) {
result = append(result, value)
}
}
return result
}
func main() {
// 整数过滤
ints := []int{1, 2, 3, 4, 5, 6}
even := Filter(ints, func(n int) bool {
return n%2 == 0
})
fmt.Println(even) // 输出: [2 4 6]
// 字符串过滤
strings := []string{"apple", "banana", "grape", "plum"}
hasP := Filter(strings, func(s string) bool {
return s[0] == 'p'
})
fmt.Println(hasP) // 输出: [plum]
}
示例2:泛型最小/最大函数
在处理数字数据时,计算最小值或最大值是一个常见需求。通过泛型,我们可以创建一个函数,它可以接受任何类型的数字(整数或浮点数),并返回计算结果。
package main
import (
"fmt"
"golang.org/x/exp/constraints"
)
// MinMax 返回给定切片的最小和最大值
type Ordered interface {
constraints.Ordered
}
// MinMax finds the minimum and maximum values in a slice of Ordered elements.
func MinMax[T Ordered](slice []T) (T, T) {
if len(slice) == 0 {
var zero T // The zero value for the type
return zero, zero
}
min, max := slice[0], slice[0]
for _, value := range slice {
if value < min {
min = value
}
if value > max {
max = value
}
}
return min, max
}
func main() {
numbers := []int{1, 3, 5, 7, 9, 11}
min, max := MinMax(numbers)
fmt.Println("Min:", min, "Max:", max) // 输出: Min: 1 Max: 11
floats := []float64{3.14, 1.41, 2.71, 1.73}
fmin, fmax := MinMax(floats)
fmt.Println("Min:", fmin, "Max:", fmax) // 输出: Min: 1.41 Max: 3.14
}
go run .\compare.go
Min: 1 Max: 11
Min: 1.41 Max: 3.14
结论
通过这些示例可以看到,泛型允许编写一段逻辑一次,然后将其应用于多种类型,从而极大地减少了代码重复和维护成本。泛型不仅提高了代码的可重用性和灵活性,还帮助保持代码库的简洁和一致性。Go语言通过引入泛型,为开发者提供了强大的工具来写出更加清晰、高效且类型安全的代码。
热门推荐
基于STM32和Zigbee无线通信技术的智慧路灯控制系统设计思路
智能家居再进化-深入了解各种协议并实现互通以控制全屋设备
减肥期间碳水化合物的摄入量,碳水化合物循环减肥法
高可用性机房建设方案:保障业务连续性与数据安全
三羧酸循环的特点及生理意义
最难以下咽的德国菜
揭秘光伏真相:光伏发电有辐射?对人体有害吗?一文带你全面了解!
长安和东风合并的最大悬念:是从行政的角度合并?还是从市场的角度合并?
VR头盔入门指南:初学者如何开始虚拟现实之旅?
统一国家崩溃,五胡乱华自此开始:八王之乱如何改变了中国历史?
固定资产折旧是指什么
荷花价格全攻略:不同地区价格对比与种植指南
创新术式丨微创优通内科胸腔镜辅助早期肺癌微创介入性根治取得新进展
单眼皮肿眼泡化妆技巧:五种眼型的专属眼妆教程
牙粉真的能让牙齿变白吗?
玩笑开过头可能违法:如何界定及法律责任解析
伯罗奔尼撒战争:希腊霸权争夺战
盘点动漫中6位绿发美少女:从腹黑到天然,各具特色的绿发魅力
如何做赛道细分项目管理
详解迁户口亲属关系证明开具流程及所需材料
呼叫中心系统如何优化排队策略?3招破解客户等待痛点
液态调味品(酱油/醋)检测的重要性与具体项目
钳子的主要种类和作用
车辆运动学、航向角、偏航角、前轮转角的区别及其在MPC中的使用
突然心慌手抖身体无力出虚汗,怎么办
师承中国的卢旺达战力"开挂式"进化,将来我们能不能吼得住?
益生菌、益菌生和酵素能否搭配使用?深入探讨三者的协同作用
“鸟”口普查,昆明用上AI
板蓝根——一种药用植物的全面解析(了解板蓝根的来源、成分和功效,保障健康生活)
最新国际货币价格波动分析:全球经济动态影响因素解读