背景函数式编程(FunctionalProgramming/FP)作为一种编程范式,具有无状态、无副作用、并发友好、高度抽象等优点。目前流行的编程语言(C++、Python、Rust)都或多或少地引入了函数式特性,但在同样是流行语言的Golang中却鲜有讨论。原因是关于Golang函数式编程[1]和GopherCon2020:DylanMeeus-FunctionalProgrammingwithGo[2]的大部分抱怨都集中在Go缺乏对泛型的支持,这使得编写类型之间的通用函数变得困难。代码生成只能解决一些已知类型的处理,无法处理类型组合带来的复杂性(比如实现一个通用的TypeA→TypeB映射函数)。关于泛型规范的提案:使用类型参数添加泛型编程#43651[3]已被Go团队接受,并计划在2022年初发布支持泛型的Go1.18,目前golang/go仓库的master分支已经发布支持泛型。此设计已被提议并接受为未来的语言更改。我们目前预计这一变化将在2022年初的Go1.18版本中可用。类型参数提案[4]基于这一显着特征,我们有理由重新审视函数在Go泛型的加持下,公式特征是否可以成为比以往任何时候都更实用。概述在本文中,我们将尝试使用Go的泛型来一步步实现一些常用的功能特性,从而探究Go的泛型的优缺点。除非另有说明(如注释中的//INVALIDCODE!!!),文章中的代码可以运行(为了减少篇幅,删除了部分包main声明和main函数,请补充你自己)。你可以自己从源码编译[5]一个go的master版本来提前体验Go的泛型,或者使用Thego2goPlayground[6]提供的在线编译器运行单个文件。为泛型添加的新语法在泛型语法提议的#Veryhighleveloverview[7]部分进行了描述,这里简单描述一下阅读本文所需的语法:函数名后面可以跟一个方括号,包括函数中涉及的类型参数列表(TypeParamters):funcF[Tany](pT"Tany"){...}这些类型参数可以用在函数参数和函数体中(作为类型)自定义一个类型也可以有一个类型参数列表:typeM[Tany][]T每个类型参数对应一个类型约束。上面的any是一个预定义的约束,匹配任意类型。类型约束在句法上以接口的形式存在。接口中嵌入类型T可以表明这个类型一定是T:typeInteger1interface{int}嵌入单一类型意义不大,我们可以使用|描述类型的联合:typeInteger2interface{int|整数8|整数16|整数32|int64}~T语法可以表明这个类型的“基本类型”是T。比如我们自定义的类型typeMyIntint不满足上面提到的Integer1约束,但是满足如下约束:typeInteger3interface{~int}提示“基本类型”是提案中的“底层类型”。目前没有权威译文,为方便叙述,本文采用。高阶函数在函数式编程语言中,
