Go语言:如何编写返回泛型类型函数的高阶函数?
修正泛型函数返回问题的方案
先拆解你代码里的核心问题,逐个修正:
1. 泛型返回类型必须绑定泛型参数
你定义的logAndReturnDefault[T]是泛型函数类型,所以返回它的iWillRewturnAFunc必须声明对应的泛型参数,否则编译器无法确定T的具体类型。同时修正函数名拼写错误(Rewturn→Return),修正后的函数声明:
func iWillReturnAFunc[T constraints.Ordered](name string) logAndReturnDefault[T] {
2. 返回的匿名函数要严格匹配泛型签名
原代码里返回的匿名函数参数是固定string,但logAndReturnDefault[T]要求参数是泛型T类型,且必须返回T类型值(原代码缺少return语句,不符合类型要求)。可以根据需求返回输入值或默认值,示例:
return func(input T) T { log.Printf("[%s] 进入返回的函数,接收输入:%v", name, input) return input // 也可改为返回默认值,比如*new(T) }
3. 调用返回的函数需传入参数并获取结果
Add函数里的i是函数类型,不能直接和a+b相加,必须调用它得到T类型结果后再参与运算,比如:
i := iWillReturnAFunc[T]("ABC") return a + b + i(0) // 传入0作为示例参数,获取可参与计算的T类型值
4. 修复日志打印的格式占位符
原代码log.Printf("", result)没有占位符,无法输出结果,改成:
log.Printf("整数结果:%v\n", result) log.Printf("浮点数结果:%v\n", result2)
完整修正后的代码
package main import ( "log" "golang.org/x/exp/constraints" ) type logAndReturnDefault[T constraints.Ordered] func(input T) T func iWillReturnAFunc[T constraints.Ordered](name string) logAndReturnDefault[T] { return func(input T) T { log.Printf("[%s] 进入返回的函数,接收输入:%v", name, input) return input } } func Add[T constraints.Ordered](a T, b T) T { i := iWillReturnAFunc[T]("ABC") return a + b + i(0) } func main() { result := Add(1, 2) result2 := Add(1.2, 3.4) log.Printf("整数结果:%v\n", result) log.Printf("浮点数结果:%v\n", result2) }
核心逻辑说明
- 泛型函数
iWillReturnAFunc通过声明[T constraints.Ordered],让编译器明确返回的logAndReturnDefault[T]对应的泛型类型 - 返回的匿名函数严格遵循
logAndReturnDefault[T]的签名:接收T类型参数,返回T类型值 - 在
Add函数中调用返回的函数时,必须传入T类型参数,才能得到可参与运算的T类型结果
内容的提问来源于stack exchange,提问作者Nikul Padhya
相关产品推荐
相关产品推荐

