Rust 学习笔记 14:泛型 (Generics)

Rust 学习笔记 14:泛型 (Generics) “Abstraction without overhead.” 泛型是静态类型语言提高代码复用率的关键。 在 Go 中,我们习惯了 interface{} (或 any) 带来的运行时动态检查,或者复制粘贴代码。 Rust 的泛型则不同,它在编译期通过单态化 (Monomorphization) 展开代码,运行时没有性能损耗。 1. 泛型函数 假设我们要写一个找最大值的函数,既能找 i32 也能找 char。 1fn get_largest<T: PartialOrd + Copy>(list: &[T]) -> T { 2 let mut largest = list[0]; 3 for &item in list { 4 if item > largest { // 需要 T 实现 PartialOrd 5 largest = item; 6 } 7 } 8 largest 9} 这里 T 是类型参数。<T: PartialOrd + Copy> 叫做 Trait Bound(类似 Java 的 T extends ... 或 Go 的 T interface ...)。它告诉编译器:这个 T 不是任意类型,它必须能比较大小,而且能被 Copy(为了简单起见,这里假设是栈上数据)。 ...

2025-04-26 · 2 min · 220 words · 老墨

GoLang教程——泛型编程入门

大家好,我是极客老墨。 Go 1.18 之前,写一个通用的 Min 函数很麻烦。想支持 int 和 float64?要么写两遍代码,要么用 interface{} 加反射,性能还差。其他语言早就有泛型了,Go 终于在 1.18 补上了这个短板。 这篇就聊聊 Go 的泛型,看看它是怎么让代码更通用、更安全的。 为什么需要泛型 没有泛型时,写通用代码很痛苦。 问题:重复代码 1// 比较两个 int 2func MinInt(a, b int) int { 3 if a < b { 4 return a 5 } 6 return b 7} 8 9// 比较两个 float64(重复代码) 10func MinFloat64(a, b float64) float64 { 11 if a < b { 12 return a 13 } 14 return b 15} 16 17// 比较两个 string(又是重复) 18func MinString(a, b string) string { 19 if a < b { 20 return a 21 } 22 return b 23} 问题:interface{} 不安全 1// 使用 interface{} 可以接受任何类型 2func Min(a, b interface{}) interface{} { 3 // 需要类型断言,容易出错 4 // 而且失去了类型安全 5} 解决方案:泛型 1// 一个函数支持多种类型 2func Min[T int | float64 | string](a, b T) T { 3 if a < b { 4 return a 5 } 6 return b 7} 泛型函数 泛型函数使用类型参数,可以处理多种类型。 ...

2025-03-22 · 9 min · 1814 words · 老墨