概述
Go 这几年的变化不算密集,但泛型和 WebAssembly 都是绕不开的两个点。前者补上了语言能力上的一块短板,后者则让 Go 多了一个运行场景。两者都不算'写了就立刻见效'的特性,真正有价值的地方,往往是在你碰到重复代码、或者想把一段逻辑塞进浏览器里跑的时候。
泛型
Go 1.18 引入泛型之后,很多原本靠 interface{} 和类型断言硬撑的代码,终于可以写得干净一点。不过它不是拿来'到处泛化'的,泛型写多了,代码也会变得不好读。我的经验是:能用在一类明确的工具函数、容器类型上,就已经够实用了。
基本用法
// 定义泛型函数
func Map[T, U any](s []T, f func(T) U) []U {
result := make([]U, len(s))
for i, v := range s {
result[i] = f(v)
}
return result
}
// 使用泛型函数
func main() {
ints := []int{1, 2, 3, 4, 5}
squared := Map(ints, func(x int) int {
return x * x
})
fmt.Println(squared) // 输出:[1 4 9 16 25]
strings := []string{"a", "b", "c"}
lengths := Map(strings, func(s string) int {
return len(s)
})
fmt.Println(lengths) // 输出:[1 1 1]
}
